%27是' %20是空格 --+是为了将后面的代码注释掉
首先使用order by 来查看有多少列
?id=1%27%20order%20by%204--+ 发现4报错了,改成3后就恢复了,说明有3列
联合查询1,2,3
?id=-1%27%20union%20select%201,2,3--+
发现数据出在2,3上了
只要输入查询语句就可以获得所有数据
但在php文件中加入过滤正则
if (preg_match('/select\b[\s\S]*\bfrom/is',$id)){
die('sql injection');
}
被正则表达式捕获了
该正则表达式匹配了select后与form前的单词边界,select和from中间的所有字符
但sql注入要查询数据必须要有select与from,想要绕过正则表达式就要select后或form前有字符
这样是匹配不上了,但是SQL语法也错了
mysql是支持科学计数法的(1e1)
这样既可以绕开正则又不会语法错误
注意1e1会让表格多一列,所以要把3去掉