明确参数类型
- 数字,字符,搜索,Json等
- sql语句中字符串要用引号包裹,因此在注入中如果为字符型(变量为字符串类型)就需要进行引号的闭合
- 其中sql语句干扰(闭合)符号: '(单引号),"(双引号),%,)(括号),}(大括号)等,具体需看写法
判断参数数据类型
- 理论上来说,只有数值型和字符型两种注入类型。
- 通过+1、-1、and 1=1、and 1=2、注释符。与其各种变种如与各种符号结合的and 1=1、and '1'='1等等判断参数数据类型。
举例
- id=1 and 1=1回显正常 id=1 and1=2回显错误(判断为整形)
- id=1 and 1=1和id=1 and 1=2回显正常(判断为字符型接下来判断闭合方式)
- id=1' and '1'='1回显正确id=1' and '1'='2回显错误(判断为【'】闭合)
- id=1" and "1"="1 回显正常 id=1" and "1"="2回显错误(判断为【"】闭合)
- 以上注入不成功的时候尝试1%df’ 此为宽字节注入
字符型
- 前台页面输入的参数是「字符串」
- 字符可以使用单引号包裹,也可以使用双引号包裹。
- 根据包裹字符串的「引号」不同,字符型注入可以分为:
- 单引号字符型注入
- 双引号字符型注入
- 带有括号的注入
- SQL的语法,支持使用一个或多个「括号」包裹参数,使得这两个基础的注入类型存在一些变种。
- a. 数值型+括号的注入:使用括号包裹数值型参数
- b. 单引号字符串+括号的注入:使用括号和单引号包裹参数
- c. 双引号字符串+括号的注入使用括号和双引号包裹参数
select \* from user where id = (1);
select \* from user where id = ((1));
select \* from user where username = ('zhangsan');
select \* from user where username = (('zhangsan'));
select \* from user where username = ("zhangsan");
请求方法
- GET, POST,COOKIE,REQUEST(全部接收,接收get,post,cookie),HTTP头等
- php中的
$_SERVER['xxx']获取某些信息
- 示例:$_SERVER['argv']:传递给该脚本的参数
- $_SERVER['REQUEST_METHOD']:访问页面时的请求方法
- $_SERVER['REMOTE_PORT']:端口
- 如果该参数代入到sql语句中,则可能可以利用,称为HTTP头部注入,通常需要括号闭合
- POST注入一般发生在有表单的情况下
HTTP头部参数数据注入测试?????
like模糊查询
- 示例:
select * from xxx where name like '%lisa%'
- %在这里起到通配符的作用
注释符
- 注释符可以将后面的语句注释掉,防止干扰导致报错,在注入时使用注释符,主要是为了消除原始查询中剩余的部分,防止语法错误
- --空格是比较通用的注释符,mysql的专属注释符是#
- --+通常在url中,因为在url中+会被解析成空格,在post提交中最好还是使用--空格或者#
- 若应用过滤空格,可用/**/注释符替代
有账号和密码
- 可以只在一个输入,也可以两个都输入,后者最好两个都输入一样的,或者在账号输入结尾加上
#''