本文首发于“合天智汇”公众号 作者:SRainbow
关于动态代码防御机制,是自己瞎取的名字,目前我还没有看到过类似的文章。如果有前辈已经发表过,纯属巧合!!!我仅是突发奇想的一个想法,说不上高大上。也就是想说出这个想法。说不定各位在座的大佬有更好的想法去完善这个方案!
![](https://pic1.zhimg.com/80/v2-c25cafedd1bf09d221677fb566bbaade_720w.jpeg)
动态代码防御机制介绍
现在的各种攻击都是针对静态代码的攻击,例如接受用户名和密码的处理语句:select * from users where id=’id’ and pwd=’pwd’。攻击者总可以想到一种方式进行攻击或者绕过,因为后端代码是写死了的,他只能按照这种方式处理,所有难以有所避免的(当然web防火墙和代码过滤也能解决,但是这里我想说的就是动态防御机制这个核心思想)。随着时代的发展也诞生出一批相当优秀的工具,例如作为sql注入的神器sqlmap,便能轻轻松松对安全防护比较弱的网站发起攻击。甚至还能直接上传文件、获取shell等操作。
由于后端代码是静止的,因此攻击者可以通过不断尝试获取数据库的的信息。如下图:
![](https://pic4.zhimg.com/80/v2-d7fcac7591b109414ac6441424be5126_720w.jpeg)
这种工具的诞生也给攻击者带来了便捷,能够很方便的对一个网站发起攻击,大多数情况下,会使用sqlmap先走一波看看啥情况,然后再人工分析。这时候想,如果后端代码是动态随机的,那么会有什么情况?这样后端代码就活动起来了,给攻击者无论是使用工具或者人工分析都带来困难了。要想注入成功,那就需要各位仁兄运气了!
如果后端代码是动态运行的,那么就会导致攻击者无法锁定后端代码从而实施注入。如下图:
![](https://pic2.zhimg.com/80/v2-cdf90a4032d85d61fa0e3703aacf930a_720w.jpeg)
SQL注入的动态防御实践
这里使用的是phpstudy搭建的一个sqli-labs环境进行操作。搭建好的效果如下:
![](https://pic1.zhimg.com/80/v2-83203863c23fecc654a843bd87aaacd0_720w.jpeg)
下面就用sqli-labs第一关作为实验对象。我们看下后端代码的sql代码:
![](https://pic2.zhimg.com/80/v2-f7ed91ce7809b3dbe15fc8888e568447_720w.jpeg)
很明显,我们只需要闭合这个单引号就能实现注入了,这会儿直接采用sqlmap进行注入,结果如下:
![](https://pic2.zhimg.com/80/v2-eaa21ff0ef2b04d743c29febce6af703_720w.jpeg)
可以看到payload是用单引号闭合注入。然后修改下sql代码,使用sqlmap进行注入的情况如下:
![](https://pic1.zhimg.com/80/v2-ae08618ddb95b48ddaa0bd19670d35d9_720w.jpeg)
使用sqlmap注入,得到的payload如下
![](https://pic2.zhimg.com/80/v2-73ba2885a621460e8915b354c229dc5f_720w.jpeg)
其实就是把单引号注入转变成了双引号注入。接下载就是动态代码防御机制了,我在这个代码中加入了随机数,通过随机的设置sql查询不断变换,导致sqlmap不能实现注入。添加的代码如下:
![](https://pic2.zhimg.com/80/v2-633e9a9f9f72cb7243c70a2bc54e72e0_720w.jpeg)
然后再使用sqlmap进行注入,效果如下:
![](https://pic4.zhimg.com/80/v2-d0a1b51c4486b4fdd1332b5b1b3a41f0_720w.jpeg)
Sqlmap工具突然就会失效了。在以前版本的sqlmap中比较容易实现,现在使用新版本sqlmap比较稍微困难了点。
总结
通过上面的这种后端代码动态变化方式,能够给防御带来一定程度上的帮助。而且我感觉这个思想应该能用在更多的场景中,还需要大家一起探索探索。
实验推荐
SQL注入基础防御对策一
![](https://pic2.zhimg.com/80/v2-436379f9aa2857d98317f894eb7f067e_720w.jpeg)
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!