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

    渗透测试 EXP 81阅读 0评论

    指引

    题目分析

    乍一看似乎无从入手,其实注意看提示即可,提示是以数值型的 id 作为请求参数。

    于是尝试在 url 中追加参数 ?id=1 ,可以看到页面回显了数据库的查询内容:

    改变 id 的值,可以查到不同的内容,推测此处是注入点:

    使用 sqlmap 注入(不推荐)

    先尝试下使用 sqlmap 解题(非必要不推荐这种解题方式,因为对于学习 sqli 毫无帮助)。

    先通过以下命令查询所有数据库:

    得到 6 个数据库:

    然后通过以下命令查询到当前数据库为 security

    再通过以下命令查询到 security 数据库的所有表名:

    得到 4 个表名:

    很明显,users 表应该就是我们的目标表,通过以下命令把整个表的数据 dump 下来:

    成功脱裤,完成挑战:

    手工注入(推荐使用 Burp 辅助)

    注意标题给出了两个提示:

    • Error Based
    • Single Quotes

    那么尝试在参数后用单引号闭合 ?id=1' 看下效果:

    页面报错,而且从错误信息中,我们注意到两个关键信息:

    • 数据库类型是 mysql
    • 错误位置是 '1'' LIMIT 0,1 (其中 1' 是我们输入的内容,不难推测输入值会自动被单引号包围

    结合异常信息,猜测这条 SQL 应该形如:

    这种 SQL 要注入其实不难:

    • 先闭合单引号
    • 然后用 union 关联查询其他表的信息 (列数可以通过 order by 测试,本题测试到是 3 列)
    • 最后再通过行注释处理掉末尾的 LIMIT 即可 ( MySql 的行注释有两种方式:#--,注意后一种方式末尾至少有一个空格

    于是可以构造 payload 为 :?id=1' union select 1, 2, 3 #?id=1' union select 1, 2, 3 --+

    注意,上面的 payload 只适用于 Burp Suite。若通过浏览器注入,需要对几个特殊字符做 URL 编码:空格要编码成 %20# 要编码成 %23 。特别地,-- 刚好在 URL 末尾,而末尾的空格会被浏览器自动删掉,即使编码也不会保留,此时需要利用 URL 把 + 识别为空格的特性,使用 --+ 代替。

    可以看到第 2、3 列被回显到页面,因此可以利用这两列查询我们想要的信息。

    例如查询 mysql 的版本以及当前数据库,可以构造 payload 如下:

    而通过这个 payload 可以查询当前数据库下的所有表名:

    这里用到 mysql 的 group_concat 函数,其作用是把某一列的所有行值串接成一个字符串。而 information_schema 是系统表,可以查到数据库中的所有表结构。

    从表名推测,users 就是我们的目标表,再次构造 payload 查询该表的表结构:

    找到目标列名 usernamepassword ,最后构造如下 payload 实现脱裤,完成挑战:


    转载请注明:EXP 技术分享博客 » CTF – sqli-labs 解题报告 [Less 01 – Error Based Single Quotes]

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

    表情

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

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