漏洞重温之sql注入(二)

漏洞重温之sql注入(二)

sqli-libs通关之旅

Less-06

进入第六关,首先咱们仍是在url里面增长id参数。sql

白盒阶段,咱们首先仍是看源码。数据库

首先,根据if判断语句里面的返回,咱们确认了这个位置的注入点是布尔型的盲注。less

由于根据代码成功与否,网页会给咱们返回不一样的内容,虽然没法直接让网页返回咱们但愿看到的信息,可是能够从代码成功与否的不一样返回结果,来获取咱们想要的东西,这也是我认为布尔盲注的判断状况。函数

同时,根据代码:测试

$id = '""'.$id.'""';
$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";

咱们能够知道,这里咱们想要闭合代码,须要用到双引号。网站

因此,咱们能够构造如下测试payload:url

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' -- 
//上面一条代码用于爆当前数据库名称。

这里,由于前面已经作过足够详细的过程,这里就不一步一步操做了。线程

第六关,通关。code

Less-07

进入第七关,先在url中添加id参数。orm

而后咱们直接查看源码。

经过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成立,因此网站会延迟返回。

经过这个方法,咱们也能够猜数据库名,表名,字段名等。

第十关,通关。

相关文章
相关标签/搜索