这边建议去我的gitbook或者github看观感更好(图片更完整)
github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun
gitbook:http://22kaka.fun
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 15:38:51
# @email: [email protected]
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
代码逻辑很简单,就是我们要让匹配 n u m 的结果是 0 ,然后 num的结果是0,然后 num的结果是0,然后num变量通过intval为1就可以了。对于preg_match匹配要是0,就说明不能是数字,但是如果是字符串的话,在下面的intval匹配中就会为0,这个时候我们要想到如果$num传入一个数组,那么对于pre_match的特性,就会输出false然后我们就会进入else语句然后num是个数组并且不为空的话,就会输出1,也就是我们的num要通过url解析成一个不为空的数组。
不知道为什么网上的wp都没有解释一个事情。就是num=[“abc”]和num[]="abc的区别。(这个地方主要是自己最开始也知道要传一个不含有数字的空的字符串去,但是后面发现其实不对。然后弄了很久才发现原来是url解析的问题。这里将讲解一下url对他们的解析的微妙的区别。)
{% hint style=“info” %}
URL解析差异!!!!!!!!!
{% endhint %}
所以在弄清楚这个后,我们能写出绕过方案
http://65b4d1c3-5cc4-426c-b856-e5c14d755ef0.challenge.ctf.show/?num[]="abc"
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: [email protected]
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
其实这个代码的意思也很明确,就是$num不能完全等于4476,但是在intval函数作用后,要等于4476,就能输出flag。
其实这一题我们看到intval函数的base为0,就应该想到intval的特性。所以我们可以让num是前面带有字母的,但是开头的数字是4476就行。类似4476ba这种。或者你想麻烦点,把他们进行进制转换也可以。
所以我们的方案就是
http://f855998e-1508-4b60-9956-e03eadde4e40.challenge.ctf.show/?num=4476ab
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:16:09
# @link: https://ctfer.com
*/
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
Notice: Undefined index: cmd in /var/www/html/index.php on line 15
nonononono
字符串a在开启了多行模式下满足正则表达式/^php$/,但是在非多行模式下,不满足正则表达式了。正则表达式的意思简单翻译就是转化后的字符串是php。
这个就是我们讲过preg_match含有的特性是绕过多行问题。我们采用的是%0a来解决的。
http://4e1772d9-0414-4f78-a71b-8b49260e5e5e.challenge.ctf.show/?cmd=%0aphp