• 如果您想对本站表示支持,请随手点击一下广告即可~
  • 本站致力于提供原创、优秀的技术文章~
  • 有任何疑问或建议 均可以在站点右侧栏处 通过各种方式联系站长哦~
  • CTF – RootMe解题报告 [Web-Server : SQL injection – file reading]

    渗透测试 EXP 549阅读 0评论

    挑战入口:Root-Me(https://www.root-me.org/en/Challenges/Web-Server/SQL-injection-file-reading)
      分类目录:Link to …(http://exp-blog.com/2019/01/02/pid-2597/12/)

    找到注入点

    利用 SQL 注入读取服务器文件。

    首先要找到注入点,为了提高效率可以直接使用 sqlmap ,测试发现注入点在这个页面:

    http://challenge01.root-me.org/web-serveur/ch31/?action=members&id=1

    通过 sqlmap 扫描发现这是 MySQL 数据库,且此处同时存在 4 个注入漏洞:

    • 基于布尔注入
    • 基于错误注入
    • 基于延时注入
    • UNION 横向越权(只有这个漏洞可以用于文件读取

    拖库

    这里暂且先不用人工方式构造 payload ,先直接用 sqlmap 解题。


    获取数据库

    先获取所有数据库的库名:

    再查到当前数据库是 c_webserveur_31


    获取数据表

    继而查询当前库中的所有数据表,只有 member 一张表:


    获取表结构

    再查询数据表 member 的表结构:


    获取表数据

    最后查询表数据,数据只有一行,记录了 admin 的账密,但是密码被加密处理过了:

    读取 index 页面的源码文件

    推测文件绝对路径

    由于我们不知道 admin 密码的加密方式,因此无法获得真正的密码。

    但是很可能在页面验证登陆账密的时候,会提供相关的代码逻辑,因此我们下一步就是尝试获取认证页面的源码。虽然题目没有说明页面的文件名称,但是不难猜测就是 index.phpindex.html

    访问页面 http://challenge01.root-me.org/web-serveur/ch31/index.php 没有 404 报错,说明 index.php 文件是存在的。

    但是要通过数据读取文件,是需要知道文件的绝对路径的。

    文件路径可以在页面尝试通过路径穿越进行试探,例如向前穿越两个目录,访问这个页面:

    http://challenge01.root-me.org/web-serveur/ch31/../../web-serveur/ch31/index.php

    因为可以正常访问且没有报 404 错误,因此可以知道路径 /web-serveur/ch31/index.php 是存在的。


    但这还不是绝对路径,因为直接访问页面 http://challenge01.root-me.org/ 列印了所有 RootMe 挑战的分类目录,其中还有一层 Parent directory 父目录,说明之前至少还有一级目录。

    虽然从 Web 页面无法查到这级父目录的名称,不过可以从需要通过 WebSSH 的其他挑战查到这个目录,例如这个挑战: ELF x86 – Stack buffer overflow basic 1 。登陆 WebSSH 后,可以查到这两类挑战的共同父级目录名为 /challenge


    读取文件内容

    拼接起来就可以得到 index.php 页面文件的绝对路径为 /challenge/web-serveur/ch31/index.php

    此时就可以通过 sqlmap 的 --file-read 参数下载这个文件了:

    查看下载到的文件内容如下:

    密码解密

    从源码可知,我们从页面输入的密码会经过三个处理步骤再存储到数据库:

    • sha1 加密
    • 通过自定义函数 stringxor$key = "c92fcd618967933ac463feb85ba00d5a7ae52842" 做异或运算
    • base64 编码

    在前面已知 admin 被加密的密码是 VA5QA1cCVQgPXwEAXwZVVVsHBgtfUVBaV1QEAwIFVAJWAwBRC1tRVA== ,根据这些步骤做逆运算即可得到真正的密码。

    由于异或运算重复计算一次就是逆运算,因此可以利用 index.php 源码,构造这样的 PHP 代码进行 Base64 和 异或运算 的解码逻辑:

    任意找一个在线 PHP 环境执行这段代码(如 http://www.dooccn.com/php/),

    得到 77be4fc97f77f5f48308942bb6e32aacabed9cef ,即这是 sha1 加密后的值。

    最后再找一个 sha1 在线解码平台(如 https://www.sha1online.org/)对其逆向暴力破解,得到真正的密码 superpassword

    完成挑战

    使用账号 admin 和密码 superpassword 登陆,知道这个密码就是 flag ,完成挑战。

    附:通过 UNION 读取 index 页面源码

    即使不使用 sqlmap 的 --file-read ,也是可以读取到 index.php 文件的内容的。

    这里要利用最开始通过 sqlmap 得到的 UNION 漏洞:

    先测试一下这个漏洞的探针效果:

    在 Mysql 中读取文件的函数为 LOAD_FILE ,只要把文件路径传参进去,就会返回文件内容。

    因此我们可以把探针的 CONCAT 函数替换掉,改造成这样的 payload :

    但是这个 payload 无法直接使用,测试发现原因是引号 "' 和文件路径符 / 不能被直接注入:


    不过符号问题可以很简单绕过,只需要把 /challenge/web-serveur/ch31/index.php 编码成 16 进制再传参即可。

    可以使用 Burp Suite -> Decoder 进行编码,得到 :

    2f6368616c6c656e67652f7765622d736572766575722f636833312f696e6465782e706870

    将其作为 LOAD_FILE 的参数(因为是 16 进制,注意前面要补 0x 声明),重新构造 payload 如下:

    执行这个 payload ,成功得到 index.php 页面的文件源码(注意要在浏览器的开发者工具里面看):


    转载请注明:EXP 技术分享博客 » CTF – RootMe解题报告 [Web-Server : SQL injection – file reading]

    喜欢 (0) 分享 (0)
    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址