ctf.show WEB模块第14关是一个SQL注入漏洞, 绕过switch循环后可以拿到一个登录界面, 登录界面存在SQL注入, 脱库以后会提示flag在另一个文件中, 利用数据库的文件读写功能读取文件内容即可拿到flag
开局是一个switch循环, 需要传递参数 c, 参数对应的执行结果有四种: '$url', '@A@', $url, "$url" ; 前两个是字符串, 没啥用, 作者的目的应该是想让我们输出后两个 $url 的其中一个, 但输出之前还有个sleep(), 选的不合适就会睡眠很长时间, 这里我们传递一个 3即可
首先科普一个PHP的特性: 单引号包裹的内容只能当做纯字符串, 而双引号包裹的内容, 可以识别变量, 所以源码中的 "$url" 可以当做 $url 变量被正常执行
switch循环有一个特点, 如果 case条件对应的代码体中没有 break或者其他循环控制的关键字, 则会继续执行下一个 case条件的代码, 这里我们传递 3, echo '@A@' 以后, 会继续执行 case 6000000 对应的 echo "$url"
?c=3
返回了一个文件, 很明显线索就在这里, 接下来我们访问一下这个文件
是一个登录界面, 盲猜存在SQL注入漏洞, 先给个true, 使SQL恒成立, 页面正常显示
由以上结果可以确定存在SQL注入漏洞, 注入点为数值型注入, 页面有回显, 推荐使用联合注入
获取当前使用的数据库
获取表
-1/**/union/**/select/**/group_concat(table_name)from/**/information_schema.`tables`/**/where/**/table_schema=database()
获取字段
-1/**/union/**/select/**/group_concat(column_name)from/**/information_schema.`columns`/**/where/**/table_name='content'
获取数据
-1/**/union/**/select/**/group_concat(username,password)from/**/content
??? 一个秘密??? 不讲武德, 提示秘密里面有一个秘密( secret), 结合开头 switch循环页面中引入了一个 secret.php, 线索应该就在 secret.php 里面
先访问一下 secret.php 文件, 可以正常访问, 没有报404, 说明这个文件确实存在, 而且就在根目录下, apache的默认网站根路径是 /var/www/html, 我们试一下读这个文件的内容
利用数据库的文件读写功能读取文件内容
-1/**/union/**/select/**/load_file('/var/www/html/secret.php')
页面并没有反应, 用代理工具( BrupSuite)抓包试试
可以看到文件的内容, 里面并没有flag, 而是提供了一个新的线索, 接下来我们根据提示读取 /real_flag_is_here
成功获取flag