让第一个参数不存在的目的是,让联合查询需要的结果能在页面回显。
常规注入步骤为探测是否有注入点,有则判断列数,判断回显位,判断当前数据库名,查询当前数据库中的所有表名,然后选取感兴趣的表进行字段查询
Less1
纯数字时,页面正常
尝试闭合标签,发现闭合成功,页面无内容

判定存在注入点

查看源码,发现闭合标签确实时单引号,且参数获取的值,没有经过任何过滤,就直接使用。于是常规的sql注入流程就可以获取到用户名和密码


Less2

由于逻辑假,所以没有查询到结果,判断为数字型查询

同样,由于参数没有任何过滤,直接使用,所以常规注入流程即可


Less3
?id=1--+时页面正常

?id=1 and 1=2 页也正常,所有判断为字符型注入,接下来需要考虑闭合标签

当第一次使用单引号后,直接报错

其他任意闭合符都正常返回页面,于是初步可以判断为闭合标签应该是单引号与其他标签组合形成的闭合符。


使用单引号和括号时,页面正常,单引号双引号结合时,报错。于是可以判断闭合标签为单引号和括号


查看源码

为什么只用单引号会报错,其他符号没闭合却没报错?
原 SQL 结构:id=('$id')
仅输入单个单引号 1' 为什么报错
传入值拼接后:id=('1'')。多出一个单引号,引号配对断裂,SQL 语法不完整,数据库抛出语法错误。
传入 1) 这类符号为什么不报错
传入值拼接后:id=('1)')。首尾原有单引号正常配对闭合,1) 整体被视作字符串内容,SQL 语法合法,因此正常执行查询。
补充 payload 1)--+
- 提前闭合左侧括号,--+ 注释掉后端多余的 '),截断原有语句,实现注入。
由于没有对参数进行任何过滤,,所以常规注入步骤即可
Less4
通less3一样,判断出闭合符即可

$id = '"' . $id . '"';
点是php拼接字符串运算符
PHP 单引号字符串:内部内容原样输出,不解析变量、不解析转义
如输入1,此时id的值就是"1"
最后再拼接成("1")


Less5--盲注类
盲注:布尔盲注,错误盲注
数据库执行 SQL,但页面不返回数据库报错,也不回显查询的数据。 仅根据 SQL 查询条件真假,返回两种不同页面状态:
- 查询条件为真:返回正常页面(业务正常内容)
- 查询条件为假:返回异常 / 空白页面
通过观察页面两种返回结果,间接推断数据库内部信息,逐位猜解库、表、字段数据。
可使用sqlmap工具,或编写python脚本自动注入
错误盲注:updatexml(1,concat(0x7e,(select database()),1)--+




源码
只会输出固定内容,输出结果随 SQL 查询真假分为两种页面:
查询条件为真输出 "You are in......";
查询条件为假则进入 else 分支,可输出数据库报错信息,该环境可支持布尔盲注与报错注入。

报错注入法

Less6
同样是盲注,注意判断闭合符

less7
依旧盲注,判断闭合符

一个单引号报错

单引号括号也报错

双引号不报错

正确闭合

依旧对输入的参数没有任何过滤,判断闭合符后盲注
')让语句中多了个)
"被当作字符串整体识别

Less8
纯布尔盲注

Less9--时间盲注
不论正确闭合与否,页面都不会改变,于是可以用时间盲注。

在burp suite中抓包后,用if(expre1,expr2,expr3):如果expr1为ture,则if返回expr2,否则返回expr3.
此处由于知道当前数据库名为security,所以返回sleep(5),让数据库查询休眠5秒,明显得发现页面有延迟

Less10
注意闭合符的时间注入
