Board logo

标题: 【原创】从手工注入看SQL防御 [打印本页]

作者: 平湖秋月    时间: 2008-8-28 14:23     标题: 【原创】从手工注入看SQL防御

大家都知道很多情况下我们在入侵时使用工具注入的时候工具猜解不出来表明和字段名,不知道大家有没有注意这是什么原因?+ k" P( d6 v1 T1 v- B/ s
我总结了下发现那是因为所有的工具都有一部自己的字典,这部字典包含了表名和字段名,如果说管理员吧表明和字段名改成了不在这不字典内哪么我们所使用的工具将永远无法猜解出字段名和表名。下面我将从分析手工注入出发一打造抵御SQL的注入防线。当然不要忘记了哦 正的就是反的,反的就是正的。就看你怎么去理解了!!呵呵
; t  e/ ], D$ b7 Y1 u# J/ k  z5 `! d4 u" ~# _! o, q. g9 X1 ~
1 判断是否存在注入点: U3 j* t5 {$ l' O: Z3 j% Q, L) w
构造简单的判断条件来判断该页面是否存在注入点,例如要检测的页面:http://127.0.0.1/111/view.asp?id=198/ s7 i0 E; X3 v- z2 ]- l& Y
(1)想要对站点进行手工注入就必须对浏览器进行设置,以保证手工注入时能够返回出错的信息,
1 T& ^: @! q" H! `8 J: j步骤:右键单击浏览器----属性---高级---取消“显示有好的HTTP错误信息”的勾--------应用!  ?- A+ |& Y- R1 Y& i4 J- i* I

9 ?8 Q8 W. h) ]! Z: N(2)像浏览器提交如下url:http://127.0.0.1/111/view.asp?id=198 and 1=1    如果存在SQL注入漏洞,就可以查询数据库。
' u( j  N* z/ q2 `1 t1 J/ B0 G7 i这里1=1是一个恒等式,可以忽略,因此会返回一个正常的页面,此页面和http://127.0.0.1/111/view.asp?id=198一样,这时便可以判断此站有希望被注入,如果返回的是一些错误的信息,哪么一些初级的入侵者可能会放弃这个站点/ ]+ L9 m$ v& S
# Z0 `: s/ F4 e! l- I5 E
(3)进一步像浏览器提交如下URL:http://127.0.0.1/111/view.asp?id=198 and 1=2     这里1=2是一个恒不等式。
9 C& d/ F) W/ R4 r" m如果站点支持数据库查询,大概会返回一个这样的提示:) ~9 x: U* Y5 P1 G# X# I
microsoft   VBScript    编辑器错误   错误’800a03f6'
$ ]1 Z% d2 b9 J缺少'End'
/ u" |* N  Q" B9 ]2 u/iisHelp/common/500-100.asp,行242
' ~) ?: y6 K% m6 j6 y4 CADODB.Field   错误'800a0bcd'
, P5 I0 W# K$ D1 `BOF或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。% d+ B: ?2 R- a' B4 P* y
/111/view.asp.  行50
- R6 d( b8 \9 ~/ R" i* j0 _6 s- A$ Z  L) h& a$ R9 w
一般出现这个信息我们就能够基本确定这个站能够进行SQL的注入了。
+ R$ i9 P' n* w
+ O+ p  U6 W: [% K; f! A4 j不过很多的时候我们只需要用一个单引号就可以快速的判断出目标站点是否存在SQL的注入,向浏览器提交如下url: http://127.0.0.1/111/view.asp?id=198'
9 G* U2 _* }6 K9 x# h4 w; J- h; @! R* E7 K# y! [% ^
如果返回的如下信息就说明有一半以上的几率存在注入漏洞:; q. x- i: j  M: h- i
Microsoft OLE DB Provider for ODBC Drivers错误’80040e14’
" x/ i4 z0 J7 g. C2 l. F7 A/ I; r[Microsoft] [OBDC
9 x2 q; X; P" j+ W- y7 `Microsoft Ac-cess Driver]
字符串的语法错误在查询表达式’id=1’中。0 U8 D' b, I! B! @( G! Y9 z" Z0 @

( d3 W: x+ T1 ?" V; l5 g& _6 b* V* [2 q/ ]! O8 Q2 @, K/ o
(4)此时我们开始构造特殊的SQL查询语句来查询站点数据库的表名,向url提交如下语句:
3 H5 }$ V8 ?' k" }  t! E0 ghttp://127.0.0.1/111/view.asp?id=198 and exists(select from *admin)
! x+ B0 L( o! q4 }6 r* @# S- G- N9 i5 `' ^0 z, Z7 d, \
这个语句是向数据库查询是否存在admin这个表,如果存在就会返回正常页面,不存在就会返回出现错误的页面,一般我们都会先测试常用的表名 当然这也是一般的注入工具密码字典内存在的表名和字段名,如果表名不存在的常用的表明中,哪么我们就用社会工程学来猜解表名,当然这样的情况下猜中表名的概率也是很低的。$ P' C& ]0 |! I

& m# ~- `$ Y1 h- r! n(5)在得到表名后开始构造查询语句查询数据库字段名,想url提交如下语句:
( `1 L% d" j# @" hhttp://127.0.0.1/111/view.asp?id=198 and exists(select user from admin)
$ B( x  w9 Q, R# `# f
/ E9 k' n( q4 C3 C: H! \这个语句是向数据库中admin表中查询师傅存在user字段,存在的话返回正常页面,附则反之" |4 s+ z" J% ?+ i2 |1 {8 ]

" z) n1 r: r4 n(6)接下来确定字段id值,语句:
) b7 p' `, e  I, Y) {* N* `! Xhttp://127.0.0.1/111/view.asp?id=198 and exists(select id from admin  where id=1)+ ~$ s+ }$ N2 H7 i/ k; I7 S( J/ z
1 s+ C, U& N( [$ k

6 V5 ]. w5 T- ]& x+ f正确返回正常页面 不存在的话返回出错页面
  a' O/ F- C& g( M1 A+ |% [( W- v$ J2 F6 P/ K) @
9 c& Z" ~" i5 C: o2 g8 m3 x
(7)在表名和字段名猜测出来以后,我们开始向url提交查询语句 猜测管理员账号的长度
; q; s( b' J6 p: k" f% w: }; k, O
http://127.0.0.1/111/view.asp?id=198 and exists(select id from admin where len(ueer),<6 and id=1)
  s5 ]" n& ?4 c4 x# u) x& Y/ u; ^. x$ d/ ^5 O0 `& y
这个语句是查询user字段中用户名长度的范围,表示长度小于6     同样的正确返回正常页面,错误的话返回出错页面4 ]& M& w  A8 L' y
缩小范围,然后构造下面的语句确定用户名的具体长度:
8 ?* f6 b5 ^! q1 A" [http://127.0.0.1/111/view.asp?id=198 and exists(select  id from admin where len(user)=5 and id=1)4 ?" }8 @4 a+ i& Z4 b8 Z$ b; X
2 I6 R9 m( o' c, v% t' d' z
这里也是正确返回正常页面 错误返回出错页面( c1 [9 f$ v7 Q& P5 K- z) ]
- V# {" r4 k( ]
(8)最后我们开始进入最后的环节查询管理员用户名,像url提交构造的查询语句:
5 k/ W# g; H7 D5 P' g7 _6 ]' \http://127.0.0.1/111/view.asp?id=198 and exists(select count(*)from admin  where left(user,1)='a')* \' U) _* s+ A) B- [

* Q0 z- R4 z9 O/ W5 ^3 b; a/ r" N这个语句是从用户名左边开始猜测用户名第一位为a,正确就会返回正常页面,错误返回出错页面,一位一位的猜,到第二位的时候修改语句为(user,2)='ad'   后面依次类推。9 M0 |, I# f4 H# r# V
5 r. D: W* P/ Y, o% }/ X' i
这样当我们得到了用户名密码以后,此次的注入也就接近尾声了!!!!!
+ l* G1 h% `& ^' p" @$ ~+ l5 p) ^# t0 N# R' |* z+ {0 x9 d3 T
1 r4 M) Y2 c; o9 N# W2 j9 d% R+ }# j" v

6 @8 g1 O* X) `# M这里再补上防范的方法吧:
! M- I* M2 f3 ?/ X实际上很简单,从这个过程来看如果表名和字段名不在常用的表名和字段名里面,那么我们一般都会采取使用社会工程学了猜解,如果说管理员修改的表名和字段名足够复杂的话那我们很难达到目的。
, Y* |4 _  `( q1 U2 `) D% \4 k当然简单的方法还有很多比如去下载防止注入的补丁程序打上 这种方法是修改站点文件,增加过滤语句来过滤入侵者提交的语句以达到防注入的目的,这个小质的一篇帖子已经说道了! F8 m7 C' K1 d

* G) f- \: p( ]好了就这些& G& p7 J8 C6 r

1 V2 [9 K9 }/ m" L辛辛苦苦敲了半天的键盘真累啊
8 f9 t$ N8 ]2 n' V3 J! K
, ?9 w- w) y3 q1 ], x% j: Y【】2 T  S' K% G, ~2 e( r. w( q& s
+ K4 W6 E5 G6 D/ f9 o
[ 本帖最后由 平湖秋月 于 2008-8-28 15:19 编辑 ]
作者: 3ast    时间: 2008-8-28 16:02

辛苦了,一篇不错的总结
作者: 柔肠寸断    时间: 2008-8-28 19:05

不错) F" ~7 D) c+ l0 F8 y3 Q
+ _, O' o$ @- W( \( e" i/ R- P
但是文章应该说说防御方面啊~~~




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com./) Powered by Discuz! 7.2