点击蓝字关注我们
无字母数字的命令执行
ctfshow web入门 55
题目:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: [email protected]
# @link: https://ctfer.com
*/
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|[a-z]|`|%|x09|x26|>|</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
该题是在黑名单中添加了字母以及常见绕过符号。
解题需要了解一下两个知识点。
-
shell下可以利用 .
来执行任意脚本 -
Linux文件名支持用glob通配符代替
题目没有过滤.命令。通过.
去执行sh命令不需要有执行权限。
对于通配符,大家常用的可能都只有*
和?
。其实还有 glob,只要找到一个可以表示“大写字母”的glob通配符,就能精准找到我们要执行的文件。
翻开ascii码表,可见大写字母位于@
与[
之间:
换个思路去解这道题,可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)
去执行执行这个文件。一般来说这个文件在linux下面保存在/tmp/php??????
一般后面的6个字符是随机生成的有大小写。(可以通过linux的匹配符去匹配)。
然后开始构造POC,提供一个html来构造上传post请求包。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包</title>
</head>
<body>
<form action="http://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="上传">
</form>
</body>
</html>
这里再提供一种更方便的方法,用yakit来构造。伟大无需多言。
然后在上传文件内容添加sh命令,使用ls成功读取到文件
直接读flag,打完收工。
原文始发于微信公众号(TimeAxis Sec):ctfshow之无字母数字的命令执行
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论