LESSON 5:
典型的布尔盲注。
盲注:sql注入过程中,sql语句的执行结果不回显到前端,这个时候就只能用一些别的方法进行判断或者尝试,这个判断或者尝试就叫做盲注。盲注又分为:1.基于布尔SQL盲注、2.基于时间的盲注、3.基于报错的盲注。
布尔盲注:一般适用于页面没有回显字段(不支持联合查询,即union select),且web页面返回True或者False,在lesson 5里就相当于回显 You are in ......(true)或者报错(false),利用枚举思想或者二分法来构造SQL语句去判断数据库长度,比如:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and length(database())>9 %23 结果返回 You are in....... 的话就说明数据库名长度大于9。比如猜解数据库名的话,http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and substr(database(),1,1)>'o' %23,判断数据库首位是否大于‘o’,根据结果可进行进一步的推测并最终确定。基本用到的方法就是枚举和二分法。
注入流程如下:
布尔盲注常用的SQL语句:
1.length(str)函数:返回str的长度,例如length(database()) ,这里就会返回数据库名的长度。
比如经常用length(database())>9,根据页面的true或者false变化来判断数据库长度。
2.substr(str,pos,length)函数:从pos位置开始,截取str字符串length长度。
例:substr(database(),1,1)这里比如数据库名为security,那么截取的就是s这1个字母。如果pos位大于str字符串的长度,则这个语句是会返回false的,比如这个语句在and或者or后面要注意。
3.ascii()函数:将某个字符的值转为ascii值。
4.left()函数:left(a,b)从左至右截取a的前b位。
5.limit i,n : i表示查询的索引值(默认从0开始),n表示查询结果返回的数量。
例如:select * from users 那就会列出 users里的所有信息,如果加一个 limit 0,1 那就只会显示第一个结果。
下面用布尔盲注来演示通过lesson-5
1.利用left(database(),1)来尝试获取数据库,结果正确,说明数据库长度是8
猜测数据库第一位:因为s肯定大于a,所以结果正确,其他字母同理,二分法可提高效率
接下来判断前两位,即是否大于sa,后面几位同理直到第8位解出。
以上是利用left()函数这个方法。
2.利用ascii()函数和substr()尝试:
输入语句:?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101%23
ps:此处table_schema可以写成 ='security',但是我们这里使用的database(),是因为此处database()就是security。
还是要注意如果在网页上写的话要把保留字符抓换为url编码。
substr(****,1,1)是获取第一个表的第一个字符 那同理,第二个字符就是substr(****,2,1)
ps:limit(0,1)获取第一个表的第一个字符, substr(***,1,1)截取***中从第1位开始的1个字符
limit(0,2)获取第一个表的第二个字符, substr(***,2,1)截取***中从第2位开始的1个字符
limit(1,1)获取第二个表的第一个字符, substr(***,1,2)截取***中从第1位开始的2个字符
......
这就是语句执行的原理,获取表就是这样挨个字符的套就行了。
3.利用regexp获取users表中的列:
下面直接演示用regexp去猜解users表中所含有的列:
因为我们需要username和password所以:
?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)%23
我讲解一下上面的语句:(个人+朋友理解可能有误,欢迎指正)首先这句话的目的是查询在users这个表里有没有前8个字符为username的列,如果有那么这个regexp的正则表达式会返回select后的值也就是1,那么括号中的内容返回值为1与等号左边的1相等则会回显You are in ...(如下图)也就猜解出了users表中有username这个列;如果regexp执行完后没有找到users表中有username列则会返回0,那么1=0不成立,页面也就不会回显You are in ... (这种方法猜解和left()以及substr()效果是差不多的就是多一种思路,而且有时候会更快一些)
3.1利用ascii和substr破解列中的内容:
?id=1' and ascii(substr((select username from security.users limit 0,1),1,1))=68 %23
也就是Dumb的首字母D 后面以及password同理,就不一一演示了。
3.利用ord()和mid()函数获取users表的内容:
(这里不定期更新)
二、报错注入:构造payload让信息通过错误提示回显出来
三、延时注入:也是白帽子讲web安全书中提到的 timing attack把
二和三 明天更新
LESSON 6:
6和5基本一致 只不过id是"包裹,5是'包裹。
所以上面lesson 5用的方法 lesson 6也是一样的这里不过多演示。
来源:https://www.cnblogs.com/Zh1z3ven/p/12405221.html