为什么学习线下靶场,因为线下靶场相比更加容易理解漏洞入门,
而且可以看到网站的源码,从而可以锻炼代码审计能力,找出漏洞的成因,
尝试自己提出绕过或者防御的措施,这里只记录一下本人觉得的线下靶场印象深刻,对本人有意义的部分
WebGoat
一.XXE
1.Let’s try
前言:
1 | 在此作业中,您将为照片添加评论,在提交表单时尝试使用评论字段执行 XXE 注入。尝试列出文件系统的根目录。 |
我们先提交评论然后抓包试试
这时我们发现评论的内容是在用xml
进行传递,
可以编写dtd
来进行内部实体注入
1 |
|
成功
2.Modern REST framework
前言:
1 | 在现代 REST 框架中,服务器可能能够接受您作为开发人员没有考虑过的数据格式。因此,这可能会导致 JSON 端点容易受到 XXE 攻击。 |
这个明显发现底下的评论传递格式不再是xml
而是在用json
进行传递
1 | json: |
这里我们看
就知道是修改 Content-Type
我们直接把
1 | Content-Type: application/json |
那就可以以 xml
形式上传评论,从而实现 xxe
注入
1 |
|
成功
3.Blind XXE assignment
前言:
1 | 在本作业中尝试制作一个 DTD,它将文件 secret.txt 的内容从 WebGoat 服务器上传到我们的 WebWolf 服务器。您可以使用 WebWolf 为您的 DTD 提供服务。secret.txt 位于此位置的 WebGoat 服务器上,因此您无需扫描所有目录和文件: |
盲注就是没有回显内容,但是我们需要把我们目标服务器的敏感文件内容获取到我们的服务器
1 | 简而言之, |
这里主要利用xml
通过DTD
实现文件包含,
先把我们自己写的DTD
文件包含在我们的服务器webwolf
,然后在webgoat
上通过xxe
进行远程包含我们站点的这个DTD
文件,然后webgoat
在解析我们的DTD
文件的时候就会把secret.txt
文件内容赋值到文件并作为参数发送到我们的webwolf
服务器
我们先发送评论看看
这里发送的是空内容,回显的内容看来是提示,
1 | 需要我们先在`webwolf`上上传文件 |
我们先抓包看看webgoat的评论的解析格式是怎么样的
看来是正常的xml
解析
我们先在webwolf
上上传我们的evil.dtd
文件
1 |
|
1 | 这里的变量赋值和前面的不同 |
上传成功后我们在incoming requests
里看到上传路径,这样在webgoat
就调用访问包含就行了
然后我们再在webgoat
抓包数据里构造我们的payload
1 |
|
虽然提示是报错,但是我们到我们的webwolf
上查看
这个是secret.txt
的值,我们看看webwolf
上有没有获得该数据
成功获取
成功
SQL-labs
这里不全写,详细建议找一下sql-labs天书,认真学习一下
less-17
其实我们可以先在源代码中看到一个函数。check_input()
函数。 就会了解为什么不在username
处进行注入
这里把这几个函数解释一下,就清楚了
★addslashes()
1 | addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 |
1 | 语法:addslashes(string) |
★stripslashes()
1 | 函数删除由 addslashes() 函数添加的反斜杠。 |
★mysql_real_escape_string()
1 | 函数转义 SQL 语句中使用的字符串中的特殊字符。 |
下列字符受影响:
1 | \x00 |
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
1 | 语法:mysql_real_escape_string(string,connection) |
所以注入处应该在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
大致意思是,在同一语句中,不能先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)
发现不能超过一行
于是用
1'and updatexml(1,concat(0x7e,(select group_concat(password) from (select password from users)a),0x7e),1)#
成功
DVWA
不要只知道payload,要仔细分析理解源码,找出出现漏洞的原因点
建议看推荐文章,下面代码审计和题目分析仅是我个人能力结果,只能尽可能说到点处
而且部分也是借鉴推荐文章内容
Upload-labs
建议看文章,最后几关二次渲染和条件竞争建议仔细学习一下