标签 BuuCTF 下的文章

先用BP抓下包,发现敏感php文件./Archive_room.php

访问http://2c3ee119-35cd-4566-9b5f-58057f82ff2a.node3.buuoj.cn/Archive_room.php 该文件

然后通过BP查看到action.php里的内容

访问 secr3t.php,拿到该目录下的php文件

对代码进行审计,发现调用了下面几个函数

  • highlight_file: 对文本进行高亮处理
  • error_reporting(0): 不抛出异常
  • strstr: 查找字符串的首次出现
  • stristr: strstr() 函数的忽略大小写版本

无法进行目录穿越 和 php://input 调用系统命令

使用php://filter 协议 进行绕过

构建URL

?file=php://filter/read=convert.base64-encode/resource=flag.php

然后解密即可

第一步:对页面进行分析

通过抓包看到页面

没有其他的敏感内容

尝试输入【1】

输入【or】后发现被过滤了

然后尝试fuzz一下

发现以下内容均被过滤

prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|"

尝试使用堆叠注入

  • 所谓堆叠注入就是将多条sql语句放在一起执行并且以【;】分开

获取到当前数据库

获取到当前数据库中到表单

由于 【from】被禁用,我们这里没有办法从flag中拿取数据

这里尝试许多办法最后在GitHub上获取到了该题目的源代码

  • \(sql = "select ".\)post['query']."||flag from Flag";

    这就是执行的sql语句

我们对源码分析发现这里有【||】表示或,传入的参数经过拼接后就成了(如query=1)

select 1 || flag from Flag

在数据库中查询就变成了

正如我们获取到的数据

现在要做的就是如何绕过【||】,并且让其执行后面的代码【flag from Flag】

方法一:使用Sql_mode 中的PIPES_AS_CONCAT函数

  • PIPES_AS_CONCAT:将【||】原本的“或”转换为“连接字符”,就是将||前后进行拼接

使用方法:PayLoad1【1;set sql_mode=PIPES_AS_CONCAT;select 1】

拼接过后的结果就是【select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag】

数据库就会识别为【select 1||flag from Flag;】注意:这里的||以及不是或的意思,是管道符的意思,就是将1查询完后,会继续查询flag的内容,然后将结果合并返回,如图

1后面的就是我们的flag

同时还有别的sql_mode

  • ANSI_QUOTES 启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 一样。设置它以后,update t set f1="" ...`,会报 Unknown column '' in 'field list 这样的语法错误。
  • NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 时不会输出MySQL特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑。
  • NO_AUTO_CREATE_USER 字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用 GRANT ... ON ... TO dbuser 顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户。5.7.7开始也默认了。

方法二:利用非预期注入方式获取Flag

我们传递过去的内容会被解析为\(sql = "select ".\)post['query']."||flag from Flag";

因此我们可以在传递值这边做文章,让数据库进行错误的判断

我们可以尝试传入1,1

返回回来的结果

在数据库中的操作

我们可以发现,这里的内容查询不是对【1,1】||【flag】而是对【1】,【1||flag】

这就是数据库对符号的判断不严谨,导致的非预期漏洞

我们就可以将","前的内容改为“ * ”, 从而构建PayLoad【 *,1 】

成功拿到flag

后端显示的结果

这道题严格意义上来说难度不大,在于考察的是对注入的掌握程度

本题中核心的知识点有:

  1. 堆叠注入
  2. 利用Sql_mode中的PIPES_AS_CONCAT 将 || 的作用转换连接
  3. 非预期注入

先抓个包看看

https://i0.hdslb.com/bfs/article/0577324bc2c5d9ae61125f65a6c0f458e688882b.png

https://i0.hdslb.com/bfs/article/bf3cec32dc7b29cdf1ed76f51628cffd73ef264a.png

发现当前服务器的版本为Apache/2.2.15 (CentOS),于是便去查了该版本的漏洞

https://i0.hdslb.com/bfs/article/e0865d88d7d903199e8cd7020a41d5fbfc0a8910.png

https://i0.hdslb.com/bfs/article/222ae74f603df623c1c27e17041913310175bdc7.png

然后通过分析源码发现可以直接查看文件目录

https://i0.hdslb.com/bfs/article/4ee7af721b9110e9c7b617da8c4dd57c8703d374.png

https://i0.hdslb.com/bfs/article/b080cd1d1e07bfe4dab1294475589c6ade5ec332.png

查看了这些目录中的内容并没有发现敏感文件,由于我是条懒狗,没有去利用另外的漏洞,查阅了别人的writeup发现在网页首页源码中就有敏感php文件

https://i0.hdslb.com/bfs/article/9a8b4c012364c196ec482ef224bf8cfd94a53a9d.png

访问后发现需要添加请求头

https://i0.hdslb.com/bfs/article/c17eda263b0222c78c305eaea9197dea2895c6b9.png

https://i0.hdslb.com/bfs/article/f96a59e74505e27dd32bb577669e4df7f877a9f5.png

添加第一个请求头 Referer

然后他报出需要“Syclover”浏览器

https://i0.hdslb.com/bfs/article/932bc89de3ded151671becede01938e7600e6643.png

https://i0.hdslb.com/bfs/article/da4413f3fe2234f53a24828e36e26ec597f27706.png

那我们就添加第二个请求头User-Agent

哪知道他又报出需要通过本地访问,这里我就卡了。

通过查阅文档发现可以添加X-Forwarded-For可以伪造本地访问

https://i0.hdslb.com/bfs/article/d65fcb895280a37efc077ce76ff84a5e4438d9dd.png

https://i0.hdslb.com/bfs/article/48aa10f14145688fd32235dad96b4686cff97411.png

https://i0.hdslb.com/bfs/article/8700539c12c172cd77994e264808ea52fef9cc09.png

这这里添加第三个请求头X-Forworded-For

最后成功拿到flag

https://i0.hdslb.com/bfs/article/7e384546ef1f2e8f5fe936b3824aaf5d79424027.png

https://i0.hdslb.com/bfs/article/02db465212d3c374a43c60fa2625cc1caeaab796.png

下面进行这道题的技术总结

  1. 考察了对敏感文件名和敏感字段名对查找
  2. 对HTTP请求头的了解
  3. Referer: 来源页面,访问该页面的前一个页面
  4. User-Agent:浏览器名称常见的如谷歌浏览器(Chrome),火狐浏览器(FireFox),Safari浏览器都有对应的浏览器请求头
  5. X-Forwarded-For:一个事实标准 ,用于标识某个通过超文本传输协议代理或负载均衡连接到某个网页服务器的客户端的原始互联网地址(Wiki百科 HTTP 头字段)

先抓个包看看

发现当前服务器的版本为Apache/2.2.15 (CentOS),于是便去查了该版本的漏洞

然后通过分析源码发现可以直接查看文件目录

查看了这些目录中的内容并没有发现敏感文件,由于我是条懒狗,没有去利用另外的漏洞,查阅了别人的writeup发现在网页首页源码中就有敏感php文件

访问后发现需要添加请求头

添加第一个请求头 Referer

然后他报出需要“Syclover”浏览器


那我们就添加第二个请求头User-Agent

哪知道他又报出需要通过本地访问,这里我就卡了。

通过查阅文档发现可以添加X-Forwarded-For可以伪造本地访问

这这里添加第三个请求头X-Forworded-For

最后成功拿到flag

下面进行这道题的技术总结

  1. 考察了对敏感文件名和敏感字段名对查找
  2. 对HTTP请求头的了解
  3. Referer: 来源页面,访问该页面的前一个页面
  4. User-Agent:浏览器名称常见的如谷歌浏览器(Chrome),火狐浏览器(FireFox),Safari浏览器都有对应的浏览器请求头
  5. X-Forwarded-For:一个事实标准 ,用于标识某个通过超文本传输协议代理或负载均衡连接到某个网页服务器的客户端的原始互联网地址(Wiki百科 HTTP 头字段)