sqli-lbs笔记:test 2
主要还是参考了《sqlilabs过关手册注入天书》和其他一些各种零散的文章,
参考链接放在文末。
盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面,此时,需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
一、布尔盲注
主要是通过构造逻辑判断
通过利用 left(),substr(),ascii(),ORD(),MID(),regexp正则,like匹配
等函数,构造相关的函数语句,根据页面的回显来分析判断所要得到的内容。
对比第四关和第五关的源码,第五关在运行返回结果正确时,只返回you are in…,不会返回数据库当中的信息了,这与第四关是不同的。
Less-4
Less-5
(1)利用left(version(),1)/left(database(),1)
进行尝试判断数据库版本(判断第一位)
?id=1’ and left(version(),1)=5%23
这里%23是#的URL编码,和–+(是两个-)的作用是一样的,都是对前边的单引号进行注释(后面为了方便看,把杠杠加换成%23了)。
–+(两个杠!页面不显示ORz)是可以直接用的;但是用#的时候,如果直接输入#会被过滤掉。
这是因为url中的#号代表html页面中的锚点,数据传输过程并不会一起带到后端,也就是这个时候的#并没有起注释作用。把#转换成它的URL编码,就可以正常使用了。
贴一篇sql注释符讲解的贴。 SQL注释符
猜测数据库第一位
?id=1’ and left(database(),1)>‘a’ %23
这里其实是判断数据库名的第一位字母是否>a。我们已经知道sqli靶场的database是security,很显然s是大于a的,因此得到正常的回显。当我们不知情的情况下,可以用二分法提高注入的效率。
(2)利用substr()、ascii()函数进行尝试
我们已经知道sqli靶场的数据库是security,我们利用substr()和ascii()函数构造相关语句,通过页面的回显来判断数据库的相关信息。
这里的>也可以换成<和=号。它实际上是通过比较ascii值(文末附ascii表),来得到肯定或者否定的结果(其实就是靠猜,通过是否有回显来证明自己的判断是否正确。)。
80是P的ascii值,👇其实是在判断数据库的第一个表的第一个字符,在字母表中的位置是不是在P后面。
?id=1’and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80 %23