mysql注入:SLEEP(duration)

昨天公司有一个移动端的项目页面打不开,第一感觉是数据库问题,然后show PROCESSLIST 查询正在运行的线程,发现果然多个select/update语句处于locked状态,然后第一反应是遭遇sql注入了,然后的确发现了一个不正常的查询语句.考虑到数据的安全,立即修改线上程序,只允许访问主页,并暂停首页的搜索功能.然后就是赶紧找漏洞....

那个sql语句是这样的

 SELECT COUNT(*) AS `numrows`
FROM (`表名` as b)
WHERE `b`.`cateid` = '1' AND SLEEP(5) AND 'kE

这个sql语句导致随后一系列的update/select语句被锁住.

可以发现,cateid字段后面的值不正常,这应该是没有被过滤的post/get值,用户可以输入任意内容.这也太危险了,赶紧去项目中,get/post参数用到cateid的地方,果然,找到了,catid虽然使用框架自带的get方法来获取,但没有开启任何过滤,这不是在裸奔吗?写这个程序的哥们也太善良了...赶紧改,改完接着找和cateid有关的post/get参数,都找完并测试了,才敢把线上恢复正常.

后来就研究这个被注入的sql语句,为什么会导致不能更新和查询?

他用了一个sleep(5),并放到了where条件中,好家伙,我们的表上万条数据,每个语句都要sleep5秒,然后这时候要update语句(更新浏览量),update语句要获取锁,需要等待select语句执行完毕,因此update语句处于"Waiting for table level lock"状态,然而myisam引擎的表,在执行update的时候,会阻塞select的执行,因此,随后的select也是"Waiting for table level lock".....然后各种查询都是这样...现在不清楚的是,为什么线下直接是"lock"状态,而我在本地测试却是"Waiting for table level lock"状态?

好了,理解了攻击者的恶意,也发现了程序的缺陷,随后便是对项目的严格检查工作了...

posted @ 2017-01-10 15:05  toDoYourBest  阅读(583)  评论(0编辑  收藏  举报