1.[鹤城杯 2021]Middle magic
分析代码:
-
<?php
-
highlight_file(__FILE__);
-
include "./flag.php";
-
include "./result.php";
-
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){
-
$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);
-
if(preg_match('/pass_the_level_1#/', $aaa)){
-
echo "here is level 2";
-
if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
-
if ($_POST['admin'] == $_POST['root_pwd'])
-
echo '<p>The level 2 can not pass!</p>';
-
// START FORM PROCESSING
-
else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
-
echo "here is level 3,do you kown how to overcome it?";
-
if (isset($_POST['level_3'])) {
-
$level_3 = json_decode($_POST['level_3']);
-
if ($level_3->result == $result) {
-
echo "success:".$flag;
-
}
-
else {
-
echo "you never beat me!";
-
}
-
}
-
else{
-
echo "out";
-
}
-
}
-
else{
-
die("no");
-
}
-
// perform validations on the form data
-
}
-
else{
-
echo '<p>out!</p>';
-
}
-
}
-
else{
-
echo 'nonono!';
-
}
-
echo '<hr>';
-
}
-
?>
包含三个if条件:
1.get传参aaa,如果aaa正则匹配pass_the_level_1#成功就会进入level 2。
2.post传参admin和root_pwd,二者传入的值不能够相同,但是sha1值要相等,相等就成功进入level 3.
3.post传参level_3,对其进行json_decode
后,如果$level_3->result == $result
就会输出flag。
第一个的绕过:preg_replace 函数执行一个正则表达式的搜索和替换。它会把传入的level替换为filtered.但是该函数只会搜索第一行的字符串,所以就可以用换行符替换。
构造:
/?aaa=%0apass_the_level_1%23
其中%0a是换行符,%23是#
第二题的绕过:md5()、sha1()函数无法处理数组,但是代码会继续运行,并且md5数组的返回值是NULL都相同。所以可以和MD5一样用数组绕过。
构造:admin[]=1&root_pwd[]=2
第三题的绕过:json_decode()函数是PHP中将JSON格式的数据转换成PHP数组或对象的核心函数。需要经过该函数处理后还是和result进行弱比较。关键是弱比较的绕过。php弱比较在面对纯字符与0的比较时,会返回true,例如a == 0
返回为true
此处result是纯字符,因此构造result->0
当我们传入的是{"result":0}时程序会输出[result]=>0,也就是经过处理后输出0
0和纯字符result比较返回true,输出flag。
最后的绕过{}里面的result可以是任何的字符,不影响输出的是0
此题总结:preg_replace 函数,正则匹配函数,但只会匹配第一行
sha1弱比较的数组绕过。
json_decode()函数的用法:
以下代码:
-
$json = '{"name":"Tom","age":18,"hobbies":["reading","music","swimming"],"address":{"province":"Beijing","city":"Beijing","district":"Haidian"}}';
-
$arr = json_decode($json, true);
-
print_r($arr);
执行结果:
-
Array
-
(
-
[name] => Tom
-
[age] => 18
-
[hobbies] => Array
-
(
-
[0] => reading
-
[1] => music
-
[2] => swimming
-
)
-
[address] => Array
-
(
-
[province] => Beijing
-
[city] => Beijing
-
[district] => Haidian
-
)
-
)
纯字符和0的弱比较会返回true。
2.[SWPUCTF 2022 新生赛]xff
看见标题就应该知道是xff请求头的伪造。
打开后看到必须是我们小红自己的电脑,
所以构造请求头:X-Forwarded-For: 127.0.0.1
但给我们返回了:Must be jump from Home Page.必须从主页跳转。
想到Referer:跳转前地址,原地址
所以把referer设置为127.0.0.1
但有的时候可能会报错,在确认正确后可以尝试多发几次发送。
可以了解一下referer的作用:
是HTTP协议中的一个字段,主要作用包括防盗链、防止恶意请求、统计网站用户的来源、记录访问来源等。具体如下:
- 防盗链。这是Referer头的一个重要作用,通过检查HTTP请求中的Referer字段,可以验证请求来源,防止未经授权的网站链接到自己的资源,如图片或视频。
- 防止恶意请求。对于一些敏感文件类型,可以通过Referer字段限制访问,确保只有来自特定来源的请求被允许。
- 统计网站用户的来源。Referer信息可以用来跟踪用户是如何到达当前网站的,这对于分析营销活动和优化网站流量非常有用。
3. [GKCTF 2021]easycms
打开后是一个网页,通过扫描工具发现,admin.php这个登录界面,用弱口令admin,12345登录成功。
找漏洞点,在设计主题哪里可以看到自定义
发现网站头部可以用php语言,构造:
-
<?php
-
system ("cat /flag")
-
?>
但是它会给我们一个报错目录,需要我们去创建。来到设置里面的微信设置
先创建一个新的
然后把原始id改成你报错的目录,注意要用../下一级目录符号
保存后就可以去修改了
在首页头部就可以看到输出的flag。
这题主要就是先进行信息收集,寻找危险的网页,这里找到的是admin.php,接着就需要得到密码登录,登录后找漏洞点,我们可以修改写入一些输出的执行语句。找到之后又需要创建文件进行文件认证,最后利用漏洞得到flag。
当然看了别人的wp,还有其他的做法,在我们创建文件后还可以在设计——>高级这里写入我们的一句话木马,然后用蚁剑连接。
目录穿越(又称目录遍历diretory traversal/path traversal)是通过目录控制序列 ../ 或者文件绝对路径来访问存储在文件系统上的任意文件和目录的一种漏洞。
常见攻击手法:
Url参数:../(父级目录,js) ..\(父级目录,php + dev css)
Nginx off by Slash:https://xxx.xx.com/files../
UNC Bypass(通用命名规范Universal Naming Convention):\localhost\c$\windows\win.ini