sql注入基础
什么是注入?
所谓sql注入,就是通过把sql命令插入到web表单提交或者输入域名或页面请求的查询字符串,最终到达欺骗服务器执行恶意的sql命令,从而进一步得到相应的数据信息
通过构造一条精巧的语句,来查询想要得到的信息
emmm上面这句话就
好比一个女孩和一个男孩去相亲,但是女孩总不能直接上来就问你有车吗有房吗,所以这时候女孩“构造一条精巧的语句”来查询她想要得到的信息(男孩有车吗有房吗)
女孩可以问男孩平时喜欢做什么事情,那如果男孩说喜欢自驾游,那就说明了男孩有车这个信息了
.....
注入分类:
1)按照查询字段:
- 字符型:当输入的参数为字符串整形时,可以认为是字符串型注入
- 数字型:当输入的参数为整形时,可以认为是数字型注入
按照注入方法:Union注入、报错注入、布尔注入、时间注入
什么是注入点
注入点是实行注入的地方,通常是一个访问数据库的连接。
怎么判断是字符型注入还是数字型注入
假设id=1,名字是大壮 id=2,名字为小明
使用 and 1=1 和 and 1=2 来判断
在url输入?id=1 and 1=1 / ?id=1 and 1=2
如果提交 and 1=1 和提交 and 1=2 都能显示正常页面,则不可能是数字型注入,即字符型注入
如果提交and 1=1 的时候可以显示正常画面,而提交 and 1=2 的时候不能显示正常页面,则是数字型注入
也可以用减法,比如,输入?id=2 的时候显示的画面是小明, 这时候输入 ?id=2-1,如果显示的画面是大壮,说明就是数字型注入,否则就是字符型,因为字符型无法做减法
至于为什么不用加法,是因为在sql中,加号+有时候会被当成空格符处理
如果是数字型就不需要关心闭合方式了,如果是字符型就要知道是哪种闭合方式
如何判断闭合方式:
如果输入?id=1'''(3个单引号),报错内容为near 1''''多了一个’,所以闭合符为 ‘
如果输入?id=1'''(3个单引号),报错内容为near 1'''')多了一个’),所以闭合符为 ‘)
闭合的作用:
手工提交闭合符号,结束前一段查询语句,后面即可加入其他语句,查询需要的从桉树,不需要的语句可以用注释符号“--+” 或 “#” 或 “%23”注释掉
注释掉意图为:利用注释符号暂时将程序脱离允许,把某段程序“注释掉”,就是让他暂时不运行(而不是删除掉)
union联合注入
使用union要注意前后的列数要相同

像这样子输入 id=1' union select database() --+ 就会出现报错,因为此时union前后的列数不同,
所以要先知道union前面的列数为多少,可以用group by 或者 order by 进行二分法查询,就是 先group by 10,看一下是否成功,失败的花就 group by 5 .... 以此类推,直到找到列数,
假设找到的列数为3
注:如果用group by出现一些错误页可以用order by 使用group by是因为group by不会被防火墙发现
命令:?id=1' union select 1,2,3 --+
1,2,3就是占位置,让union后面的列数和前面的列数保持一致
假设现在数据库有2行,如下
id usename password
1 benben good
1 2 3
接着就要查询 回显位
有时候页面只会出现一个内容(比如第一行(1,benben,good)),第二行的内容是不显示的,所以如果要查看第二行的话,可以修改命令为:?id=-1' union select 1,2,3 -++,把id改为数据库不存在的数据即可

可以发现,2和3都是可以回显的,所以就可以利用2和3这2个位置来查询你想要的信息(1位置则无法利用,因为没有回显),比如查询数据库名
输入命令:?id=1' union select 1,2,database() --+

可以发现,数据库名为security
小结步骤:
1、查找注入点
2、判断是字符型注入还是数字型 比如 and 1=1 或者 and 1=2 / ?id=3-1
3、如果是字符型注入,则要找到是哪种闭合方式 ' " ') ")
4、查询列数 group by 或者 order by
5、查询回显位置 id=-1

浙公网安备 33010602011771号