漏洞重温之sql注入(二)
漏洞重温之sql注入(二)
sqli-labs通关之旅
Less-06
进入第六关,首先我们还是在url里面增加id参数。
白盒阶段,我们首先还是看源码。
首先,根据if判断语句里面的返回,我们确认了这个位置的注入点是布尔型的盲注。
因为根据代码成功与否,网页会给我们返回不同的内容,虽然无法直接让网页返回我们希望看到的信息,但是可以从代码成功与否的不同返回结果,来获取我们想要的东西,这也是我认为布尔盲注的判断情况。
同时,根据代码:
$id = '""'.$id.'""';
$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
我们可以知道,这里我们想要闭合代码,需要用到双引号。
所以,我们可以构造以下测试payload:
1" and 1=1 --
1" and 1=2 --
//上面两条用于在黑盒情况下判断是否存在注入。
1" and 1=((select count(*) from information_schema.schemata)>1) --
//上面一条代码用于判断网站有几个数据库,通过修改小于号后面的内容来得到准确答案。
1" and length((database()))>1 --
//上面一条代码用于判断当前数据库名称字符长度。
1" and substr((database()),1,1)='a' --
//上面一条代码用于爆当前数据库名称。
这里,因为前面已经做过足够详细的过程,这里就不一步一步操作了。
第六关,通关。
Less-07
进入第七关,先在url中添加id参数。
然后我们直接查看源码。
通过if判断语句,我们看出,代码成功执行与否,依然会返回不同的结果,所以我们就只需要关注一行代码。
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
根据这条代码,我们可以知道,这条语句,想要闭合,我们可以使用 '))来进行闭合,以此进行sql盲注。
同理,我们可以使用上面总结的代码进行盲注。
第七关,通关。
Less-08
废话不说了,直接看源码。
首先,我们可以看到,if判断框里面返回的结果依然是不同的,如果代码正常执行,网页会返回you are in .........,如果代码执行失败,则不会有任何返回,我们可以通过这点区别,直接进行布尔型盲注。
同时,我们只需要查看下方代码:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
通过这行代码,我们就知道,闭合只需要使用单引号。
第八关,通关。
Less-09
第九关,直接查看源码。
首先,我们看if判断语句,代码执行成功和失败,网页上我们能看到的返回结果都是“you are in........”,但是,我们如果仔细看代码的话,就会发现其实代码执行成功和失败,两个代码块是会有区别的,而区别在于else下面的代码块中,多了下面这行代码:
echo '<font color= "#0000ff" font size= 3>';
而这行代码,如果我们不点击查看页面源码的话,是很难发现的,所以,这个关卡,就出现了两种可以使用的破关办法。
一.时间盲注
时间盲注最常利用到的函数是sleep()函数。通过这个函数,我们可以让页面延时回复,而通过网站回复的时间,我们就可以以此判断我们执行的代码知否成功,通过这个手法,来拿到自己想要得到的数据。
如何测试网页是否存在sql时间盲注,最简单的手段就是在闭合代码后,直接在后面接上 and sleep(3)然后刷新网页,如果网站延时三秒回复,那么就说明了该处存在时间盲注。
这里还要代入一个知识点,就是if语句,格式如下:
if(条件,条件成功返回结果,条件失败返回结果)
利用if语句和sleep函数,我们就可以直接获取我们希望得到的数据。
常用payload如下:
1' and if(length((database())>1,sleep(3),1)) --
//如果当前数据库名称字符长度大于一,网站延迟三秒显示。
1' and if(substr((database())1,1)='a',sleep(3),1) --
//如果当前数据库名称第一个字母是a,网站延迟三秒显示。
可以看到,时间盲注跟布尔型盲注的区别就是多了一个if函数,我们只需要将之前布尔盲注的代码放在if语句的条件位置,就可以完成时间盲注,因为截图也无法看出效果,所以这里就不截图了。有兴趣的可以自己尝试。
ps:每关的代码的隔断,都是按照每关的代码进行的,如果直接复制代码的话,需要看清楚关卡。
二.布尔型盲注
之前说到,第九关存在两种破关方式,时间盲注和布尔盲注。其实所有的盲注,都可以使用时间盲注的手法来进行,但不是每种时间盲注都可以使用布尔盲注的手法,这一点一定要记清楚。
这里虽然网页的返回结果一致,但是else的代码块中,又多echo了一个font标签,而这会显示在网页源码中,直接查看网页是很难看到区别的。
但是,我们很清楚,没测试一个字母,都要查看网页源码是个很麻烦东西。
所以,我们可以想到这样一点,如果我们的代码执行失败,网页会给我们返回else代码块里面的内容,如果我们的代码执行成功,网页会跟我们返回if代码块里面的内容。因为这两个代码存在的区别(else代码块多了一条echo)就会导致返回else代码块内容的返回包报文长度会比返回if代码块内容的返回包长。
话不多说,上图。
可以看到,如果利用burp看的话,就可以很明显的查看到代码执行成功和失败了。
当然,burp除了可以用在这种情况,还能帮我们减少时间盲注的等待时间。这个,我会在下一关进行时间盲注的时候详细说明。
第九关,通关。
Less-10
第十关,直接看源码。
眼尖的朋友可以看出来,这一关和第九关几乎一致,只是代码的隔断从单引号变成了双引号。
所以,通关第九关使用的手法,在这里依然适用,那么通关方式我就不讲了,直接跟大家详细的说一下,如何使用burp减少我们sql时间盲注的时间。
首先,我们在页面上构造一条时间盲注的语句。
ps:这里在网页上构造的原因是因为我们可以使用hackbar直接将我们输入的空格等进行转义,如果是抓包之后再写,会很麻烦。
payload如下:
1" and if(length((database()))<1,sleep(3),1)
//这条代码是判断当前数据库名称长度是否小于一,如果小于一,网站延迟三秒回复,大于一,则正常回复。
使用burp抓包,并直接将其ctrl+r放入repeater模块。
这里我们可以看右下角的两个数字,一个879 bytes 一个 30millis。
前面的那个,代表了返回包的字节数,后面那个,则是响应时间,单位是毫秒。
因为我们知道,数据库名称长度肯定大于一,所以我们将一改为十,看一下结果。
这里可以看到,下方的两个数字变成了916 和 3080。
这是一个更清楚的进行时间盲注的手法,但是还不是我要说的节省时间的方法,毕竟虽然可以更清晰的查看到代码成功与否,但是需要等的时间,我们还是等了。所以,为了节省时间,我们就需要使用burp的爆破模块。
当然,这里要注意一点,在使用burp的爆破模块进行时间盲注的时候,线程数一定要调成1
将我们刚才用到的请求包放到爆破模块里面,并且将判断字符长度的1设置为变量。
设置完成,直接开始爆破。
这里可以看到,因为我们设置的是小于,所以在爆破到8的时候,明显返回变慢了,这代表代码执行成功了,我们也就可以知道,当前数据库的字符长度为8。因为8<8不成立,所以爆破到8的时候网站还是正常返回,但是8<9成立,所以网站会延迟返回。
通过这个方法,我们也可以猜数据库名,表名,字段名等。
第十关,通关。