NSS [鹤城杯 2021]Middle magic
源码直接给了。
粗略一看,一共三个关卡
先看第一关:
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";
(1条消息) PHP正则表达式_php 正则_无痕之意的博客-CSDN博客
正则表达式含义:
/^(.*)level(.*)$/
:包含字符串"level"的字符串
/pass_the_level_1#/
:字符串"pass_the_level_1#"
这种正则写法是存在缺陷的:.
用于任意字符匹配并不包括换行符,而且^ $
界定了必须在同一行,否则匹配不到,直接利用%0a
(换行符)进行绕过。
所以我们GET传入aaa=%0apass_the_level_1#
就行了。不对,不是这样。
如果直接传入#
的话,#
代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print
就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。
只有将#转码为%23,浏览器才会将其作为实义字符处理。
所以这一关的payload:
?aaa=%0apass_the_level_1%23
来到第二关:
php
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?";
我们需要POST两个变量,admin
和root_pwd
。要求两个变量不能弱相等并且两个变量的sha1值强相等。
我们可以sha1强碰撞或者数组绕过。方便一点,这里用哈希数组绕过,强碰撞payload太长了。
admin[]=1&root_pwd[]=2
来到第三关:
php
if (isset($_POST['level_3'])) {
$level_3 = json_decode($_POST['level_3']);
if ($level_3->result == $result) {
echo "success:".$flag;
要求我们POST提交一个level_3
变量,是json格式的。要满足level_3
变量的result
键的值 与$result
变量相等,但是$result
变量在index.php
中未定义,在result.php
中是否定义,未知,所以$result
变量具体值是多少我们无从得知。暂且将他当成未定义,那么值就是空,NULL
。
这里据说用php的弱比较。以下是一些可能是原理的资料。
(1条消息) CTF(JOSN弱类型)_ctf json_sunshinelv99的博客-CSDN博客
(1条消息) JASON格式与布尔绕过弱类型比较_json数组绕过_王俊凯迷妹的博客-CSDN博客
实际测试证明,这里level_3只要POST了就行,值是多少都可以。因为空NULL
和什么东西弱比较都是true,那么就验证了我们的猜想,$result
变量未定义。
payload:
&level_3={"result":"chxvjxkvjckvrfghrekj"}
&level_3={"result":0}
&level_3={"result":}
&level_3=
扩展阅读:json数组、json对象。