题目链接:
http://www.shiyanbar.com/ctf/30
分析:
打开题目提供网页 , 发现是一个登陆页面 , 而且提供了源码 :
根据源码可得知 , 使用了ACCESS数据库
(通过搜索 : Microsoft.jet.OLEDB.4.0 可得知)
直接找到关键代码 :
关键代码 :
1. 如何处理用户输入
2. 如何构建SQL语句
如下图 :
sql = "select * from bdmin where name='" & name & "'"
这里我们可以利用联合查询构造SQL查询返回值达到满足代码逻辑的效果
由于我们审计代码可以得到 , 这里对用户输入并没有任何检查 , 直接拿来构造SQL语句
所以理论上我们就可以在这里执行任何的SQL语句 , 只要这里连接的数据库的这个用户的权限有多大 , 我们的权限就有多大
注 : 有的题目中 , 会留一个PHP可以读取文件的后门 , 这也是和这道题的效果是差不多的 , 只要PHP在服务器上的权限有多大 , 我们拿到后门后权限就有多大
然后我们就可以开始进行构造和攻击 :
这种UNION联合查询的攻击的主要是利用前一部分查询失败后会显示后一部分查询的结果这个原理
因此我们要利用的话 , 就需要构造参数让前一部分的查询失效 , 然后我们后一部分有用的信息就可能会被显示出来
构造输入如下 :
Username : 0' union select 1,1,1 from bdmin %00
Username : 0' union select 1,1,1 from bdmin
Password : 1
下面我们来解释一下为什么需要这么构造 :
- Username中 :
这里第一字符0就是为了让前一部分的查询失效 , 随便写就行- 第一个单引号是为了闭合代码中SQL语句的前一个引号
- union select 1,1,1 from bdmin 这里 select 1,1,1 from bdmin就是构造一个返回值为 1,1,1 的结果
- 最后的 %00 是由于ACCESS数据库没有注释这一说 , 因此使用00截断对SQL进行结束
- Password中 :
- 这里的密码要和上面我们构造的1,1,1进行对应
本地构造演示 :
这样就可以任意构造我们想要的返回值
输入我们构造好的用户名和密码即可拿到flag
发现在输入的时候又有问题了 , 这里在前端对用户名的长度做出了限制 , 直接使用Chrome的调试工具进行调试 , 将input标签的maxlenght属性去掉即可
或者也可以不使用他的网页 , 直接发送POST请求 (利用Chrome插件 : PostMan / 利用Python脚本 / 利用BurpSuite .... )
**后记 : **
写完之后发现一个错误 , 这里不能直接使用Chrome发送Post请求 , 因为我们这个SQL语句最后需要注释掉原本SQL语句后面的引号 , 因此使用了%00 , 但是在浏览器发送数据的时候 , 首先会将数据URL编码 , 然后再进行发送 , 因此我们需要使用Burp发送 : 如下图 :
答案:
Great! Key:BeautIful111
知识点: