1.堆叠注入
堆叠注入的原理很简单就是使用分号来执行两条不同命令,因为在数据库中就是使用分号来进行语句的分隔的,但是使用堆叠注入,由于第一条语句的原因,并不会插入的堆叠注入返回任何结果,但实际上是执行了的。我们在注入的过程中,union后面只能跟select查询语句,而堆叠注入可以进行增删改查,对数据库危害极大属于高危漏洞。
我们首先来看sql-labs的38关的原代码
他的sql执行函数使用的是mysqli_muti_query而不是我们常看见的mysqli_query,他们最重要的区别就是前者能执行多条语句,而后者只能执行一条语句。所以当有执行函数使用mysqli_muti_query切没有对传参做严格过滤的时候我们可以使用堆叠注入。我们来验证一下。
判断注入点闭合逃逸我就不多讲了,前面说过很多次了,接下来直接insert
pyload:id=1';insert into users(username,password)values("2222","2222")--+
进库查看结果,执行成功:
2.二次注入
二次注入严格上说应该是逻辑上的问题,比如我在注册时注册了admin‘#这个账户,#在传入数据库时被转义当成字符串处理,没有产生注释的效果,而在传出时没有进行转义,当我们修改admin’#的密码,由于#是注释符,所以我们修改的是admin的密码。
我们看sql-labs24关的代码,以下是注册新用户时的代码
我们可以看到使用了字符串强制转换的函数,就是在特殊符号前加反斜杠强制转义,但是在修改密码的时候,他的sql语句是这样的
由于我们的用户名是admin‘#,所以语句就变成了
update users set password=’$pass‘ where username='admin'#'.......
#后面的就被注释了,修改了admin的密码
3.宽字节注入
前面我们说了使用mysql_escape_string来强制转换特殊字符如单引号#等,那我们有没有其他方法来绕过这个防御机制呢,答案是有的,那就是宽字节注入。前提是数据库使用的是GBK编码。
这里由于比较简单,所以只将原理就不演示了
原理是当数据库使用GBK编码时,我们输入一个单引号‘会被转义函数强制加上反斜杠变成’ ,这样单引号就只是一个字符没有特殊含义,GBK编码一个汉字和一个英文单词都占两个字符,当数据库字符集为GBK时,%df可以理解为半个汉字,当%df或者%dc和转义符\在一起时,数据传输到数据库中,GBK会4个字符4个字符的读取,他们两个的ascii码凑在一起是表示一个汉字的ascii码,所以转义符就被吃掉了。所以只需要在单引号前加%df就ok了
3.http头注入
这个比较简单,很多网站都会把cookie或者refer等http头存入数据库中,所以我们只需要抓包在cookie或者refer等地方插入注入语句就ok了,这个告诉我们不要只盯着肉眼可见的地方进行sql注入,只要是与数据库有交互的点,都可能是一个注入点