MySQL注入总结
二次注入
简介
在第一次进行数据库插入数据的时候,过滤不严格,在写入数据库的时候还是保留了原来的数据,但是数据本身还是恶意数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
例子
select * from users where username =’$_SESSION[‘username’]’
登录/注册处的SQL语句都经过了addslashes函数、单引号闭合的处理,且无编码产生的问题。
对于上述举的语句我们可以先注册一个名为admin’ # 的用户名,因为在注册进行了单引号的转义,故我们并不能直接进行insert注入,最终将我们的用户名存储在了服务器中
注意:反斜杠转义掉了单引号,在mysql中得到的数据并没有反斜杠的存在。
在我们进行登录操作的时候,我们用注册的admin’ # 登录系统,并将用户部分数据存储在对于的SESSION中,
如$_SESSION[‘username’]。
上述的$_SESSION[‘username’]并没有经过处理,直接拼接到了SQL语句之中,就会造成SQL注入,最终的语句为:
select * from users where username ='admin' #'
简单的说此种注入一般会在有魔术引号的地方比较的多,常用的利用方式是先创建一个新的用户,然后更改用户密码把管理员的密码更改掉。
约束攻击
产生原因:
1.创建表格的语句限制了长度
2.超过了限制长度,mysql会截取限制长度的内容进行插入
3.而对于SELECT查询请求,若查询的数据超过限制长度,也不会进行截取操作,这就产生了一个问题。
4.通常对于注册处的代码来说,需要先判断注册的用户名是否存在,再进行插入数据操作。
5.如我们注册一个username=admin[25个空格]x&password=123456的账号,服务器会先查询admin[25个空格]x的用户是否存在,若存在,则不能注册。若不存在,则进行插入数据的操作。
6.而此处我们限制了username与password字段长度最大为25,所以我们实际插入的数据为username=admin[20个空格]&password=123456。
7.接着进行登录的时,我们使用:username=admin&password=123456进行登录,即可成功登录admin的账号。