很久没讲过了漏洞了,但是作业还剩个白名单bypass,那就两个来个大锅炖吧
那我们就先来讲一下缓冲期溢出吧
对于缓冲区溢出,大家可能感到很陌生,但是一旦说到一些0day,像(CVE-2014-0160)->心脏滴血,(ms17-010) ->永恒之蓝,(CVE-2023-38545)->Libcurl Socks5堆缓冲区溢出,大家绝对不会感到陌生
所以什么是缓冲区溢出呢?
- 缓冲区溢出:向缓冲区写入超过其预定容量的数据时,导致了内存溢出,栈帧破坏,执行恶意代码
举个例子:比如系统只能让你输入20个字符,但是你输入21个字符,而且程序并没有进行边界检测与过滤导致了程序的崩溃以及更严重的后果
缓冲区溢出的危害其实一点也不亚于文件上传,毕竟能爆出缓冲区漏洞的基本上都是0day了吧(这种是最恐怖的!!!)
再举个栗子
Heartbleed心脏滴血:是Openssl库中的TLS/DTLS实现中的一个严重错误,因为其有一个名为心跳的拓展,用于保持与服务器的活跃连接,通过心跳❤ ,用户可以发送请求给服务器,要求服务器返回同样长度的数据,以确保连接
那么这时候问题就出现了,当攻击者发送一个较小长度的Payload的时候,服务器就会返回实际长度的数据(包括服务器的私人钥匙和用户凭证的私密信息)所以当时这个漏洞也是响彻一方!!!!~`~~
顺带提一嘴,ms17-010的缓冲区溢出,导致了攻击者可以写入恶意代码,导致可以反弹shell(这个我后面讲),远程获取你的电脑控制权
对于防御,就是设置相应的边界检测,以及防止调用一些危险的函数咯
下面是文件上传的靶场writeup
其实一开始做这一关的时候呢我是没有思路的,就算是看来老师在课堂上的解析,也还是懵懵的
但是最后经过课后的揣摩之后,终于恍然大雾
其实,这一关必须要有两个前提
首先要真正的理解白名单我们需要先分析他的源码,我们来逐行解析
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
strrpos
函数找到文件名中最后一个点(.)的位置,然后使用 substr
函数截取该点后面的部分,从而得到文件的扩展名rand
函数生成一个两位数的随机数,以及当前日期时间作为文件名的一部分。这么说可能还有点懵,我们结合BP的抓包就更好理解了(这是我们直接上传一个webshell.php的)
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
我们最终访问的路径就是img_path,我们知道file_ext已经不可能是php这些的了,那我们就可以从save_path入手,这里就涉及到了%00的截断了,系统在对文件名的读取时,如果遇到%00(准确点来说时遇到0的时候),就会认为读取已结束。
那这样的话是不是就可直接截断后面的所有内容只留下一个save_path ,而且,save_path是不是直接在BP上面显示呢,那我们直接改就好了鸭
哈哈,那是因为根本就没有这个文件路径,早在webshell.php的时候就被截断了(听懂掌声)
这一关我们先抓个包,还是一眼就发现了save_path路径
但是你直接像上一关一样用%00截断是没有用的,因为%00是对于url编码的,那么这里我们就要用二进制编码了,刚好BP为我们提供了一些相应的工具
Then Bingo!!(当然,和上一关一样,记得删掉多余路劲哦)
到这里就结束了,有没有发现,白名单的过滤,才是基本上最难的,这不允许,那不允洗
但其实吧,大部分的企业的官网的存在文件上传的点,都是白名单过滤,但是也不要气馁,毕竟总不是所有地方都被过滤的死死的,毕竟,(没有绝对安全的系统)!!!肯去做,总有挖到洞的概率,毕竟一个洞,可是上千的呢!! 不说了,饿死了,小编先下去买个小丸子吃