1.RCE
一、rce漏洞概述
在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞;
二、常见RCE漏洞函数
1.系统命令执行函数
system():能将字符串作为OS命令执行,且返回命令执行结果;
exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);
shell_exec():能将字符串作为OS命令执行
passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上;
popen():打开进程文件指针
proc_open():与popen()类似
pcntl_exec():在当前进程空间执行指定程序;
反引号``:反引号``内的字符串会被解析为OS命令;
2.代码执行函数
eval():将字符串作为php代码执行;
assert():将字符串作为php代码执行;
preg_replace():正则匹配替换字符串;
create_function():主要创建匿名函数;
call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
3、RCE绕过
管道符
; | A;B | 无论真假,A与B都执行 |
& | A&B | 无论真假,A与B都执行 |
&& | A&&B | A为真时才执行B,否则只执行A |
| | A|B | 显示B的执行结果 |
|| | A||B | A为假时才执行B,否则只执行A |
空格过滤
以下可代替空格 | ||
< | <> | %20(即space) |
%09(即tab) | $IFS$9 | ${IFS} |
$IFS | {cat,/flag} |
三、靶场实践
实验靶场:pikachu
1.ping
首先这是一个ping命令,先输入baidu.com,命令执行并返回结果
然后我们可以尝试去执行一些系统命令拼接在一起,如:baidu.com&&whoami
2.eval()
直接输出phpinfo();
2.文件包含
一、文件包含原理
开发人员通常会把可重复使用的函数写到单个文件中,在使用到某些函数时,可直接调用此文件,而无须再次编写,这种调用文件的过程被称为包含。
注意:对于开发人员来讲,文件包含很有用,可以简化代码。
文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,最终造成攻击者进行任意文件包含。
注:包含的文件会被当成脚本文件进行解析。
文件包含本身是一种技术,但由于包含的文件不可控,就导致了文件包含的漏洞
漏洞类别:
文件包含漏洞分为本地文件包含(LFL,被包含的文件在本地服务器),远程文件包含(RFL,被包含文件在远程服务器)
远程包含文件需要在PHP配置文件中开启
allow_url_fopen=On(默认为On)规定是否允许从远程服务器或者网站检索数据
allow_url_include=ON(PHP 5.2之后默认Off),规定是否允许include/require远程文件
二、函数解析
首先我们来了解4个函数((php)
include:使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行。
require:在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最好后按新的php文件执行程序代码。
include_once:使用include_once会在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明)
require_once: require语句的延伸,他的功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(同时使用require_once语句在同一页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)
三、靶场实践
1.LFL本地文件包含
先随便提交一个查询,发现这些文件应该都是后台存在的,但是文件名是由前端传向后端的,这意味着文件路径我们可以自己指定。
比如我们查询系统配置文件:C:/Windows/System32/drivers/etc/hosts
,用../
和./
去改变路径
2.RFL远程文件包含
首先要开启远程文件包含
然后我们这里自己写一个html页面或者一句话木马,我这里就还是用一句话木马。
还是先观察信息,这里其实是一个远程链接,我们改成我们一句话木马的url。
3.CSRF
一、CSRF(跨站请求伪造)概述
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。
二、靶场实践
1.GET
拿到这样一个页面知道我们是要登录的,点提示,然后知道了几个用户名和密码。现在假装我们是lili,然后登录
然后我们点击修改个人信息,修改成功后抓包
这是我们抓到的GET /pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345566777&add=qqqqqq&email=555&submit=submit HTTP/1.1
那么我们就知道url的构造了,然后我们自己改一改后面的参数
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=8888888&add=shuai&email=qq.com&submit=submit
这个时候我们把这个链接发送lili,然后lili点击之后信息是否会修改呢。
直接浏览器新开一个页面,然后复制修改后的链接并回车
直接就修改了,回到原来的网页看还是之前的,但是刷新后发现已经变成我们修改之后的信息了
2.POST
我们换vince登录,然后还是抓包
post请求内容不在url中,此时我们就只能自己构造一个站点,这里直接就用burp去生成CSRF Poc代码,右键请求包 → Engagement tools → Generate CSRF PoC;然后把html复制,然后自己重新构建
这里还是将该页面放在小皮www目录下,然后让vance点击。
先重新刷新,页面还是如下:
然后打开链接点击submit
此时已经修改成功。
3.Token
然后登录allen,还是抓包查看
然后发现是get请求,但是后面添加了防csrf的token,此时构造一般的poc是不行的,token的值一直在变化。此时我们就要用到burp的插件 CSRF Token Tracker,在Extender里面下载:
CSRF Token Tracker 可以自动获取 csrf 的 token,对于一些有 csrf 限制的请求,它可以绕过该限制,如暴力破解具有 csrf token 的登录请求,在渗透测试过程中CSRF Token的自动更新。
点击好后,工具栏上方就会多出CSRF Token Tracker 这个功能,然后设置规则
接下来将之前抓到的包发送给repeter,然后将手机号修改为555555555,看能否修改。先点击森达,然后再次点击会出现重定向,然后我们再点击跟随
然后查看render,已经修改成功
三、总结
csrf需要用户已经登录这个网站或者web应用,然后再点击攻击者发送的钓鱼页面才能执行成功,所以·它和XSS最大的区别就是,xss是可以拿到用户的cookie的,而csrf仅仅是利用cookie,在不知道用户conkie时通过web页面构造钓鱼链接,让用户点击。