这边建议去我的gitbook或者github看观感更好(图片更完整)
github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun
gitbook:http://22kaka.fun
🏈 CTFSHOW PHP特性
(1)WEB 89
①代码解释
<?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: h1xa@ctfer.com
# @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 %}
- 对于num[]=1 ,num被解释为一个数组,其第一个元素为1。这个时候数组的键值是动态生成的索引,例如num[0]=1&num[1]=2。这个时候表达的意思其实是num是个数组,包含一个元素为1的数组。
- 对于num=[“1”],其实num被解释成为了一个字符串,其值为[“1”].
所以在弄清楚这个后,我们能写出绕过方案
http://65b4d1c3-5cc4-426c-b856-e5c14d755ef0.challenge.ctf.show/?num[]="abc"
(2)web 90
<?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: h1xa@ctfer.com
# @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
(3)web 91
/*
# -*- 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