今天给大家讲解下关于PHP代码审计的SQL注入,sql注入这个漏洞,我们可以说是经常能遇到的,那么这个漏洞它在代码层面它是怎么样的一个效果,它是如何产生的,我们又该如何去防御,下面我们就和大家一起来看一看它在代码里面是以什么样的一个形式来产生的。这边我们也搭了一个简单的一个小靶场。模拟一下后台的一个登录框,我们在这边正常的输入我们的用户名密码,这边提示登录失败,说明我们的用户名密码不对。如果它这里登陆框产生了SQL注入的话,我们这边执行我们精心构造的一个恶意语句,然后密码我们可以随便输,这边点击登录,可以看到这边是已经登陆成功,绕过了他一个登录的一个防护,成功进入到他的后台。那么这个漏洞在代码层面里面是怎么展示的,我们下面就可以一起来看一看他的源码。好,这个就是刚才那个小靶场的一个源码,可以看到代码也是非常的少。这边我们可以一起来看一下,这里就是我们登录框,就是我们登录框传入的用户名,他这边进行了一个接收,然后密码也是一样。然后第七行这边对我们传入的用户名和密码进行了一个sql语句的一个拼接,那拼接的过后,然后他这边利用query这个函数,执行了我们的SQL语句,执行过后返回一个数组。
这个数组里面就是我们执行的一些数据一些信息,然后他用这个函数来判断这个数组里面是否有信息,如果有信息的话,这边就返回一个true然后这边就进入这个
if的判断,成功登录,如果不是的话,它就会返回一个false这边也就到达了一个登陆失败的一个效果。SQL注入它是在哪里产生的,就是在这一段里面产生的,因为它在这里对我们的一个传入的一个字符串进行了一个拼接的一个操作,然而它并没有对我们传入数据进行一个过滤进行一个验证。
那么我们传入的数据在这里面和它这个单引号闭合过后,就会产生一段新的语句,我们可以输出给大家看一下,这边我们把它的sql、语句进行一个输出打印,这样我们看的比较清楚。我们这边输入正常的用户名,密码,可以看到这边返回来是这么一条语句,可以拿过来看一下这条语句在数据库里面最终执行的语句,可以看到他是去数据库表里面,查询user
name等于admin和password等于MD5加密过后的一个密码,如果查到了之后他就会正常的登录,如果查询不到,他就会返回一个false。那么我们SQL注入插入进去,它是一个怎么样的一个sql语句,我们也可以来看一下。
这边执行我们的SQL输入。我们来看一下。它最终是这么一串语句,我们可以拿过来对比一下,可以看到我们传入的是这么一个东西,我们在登录框里面写的就是这么一条语句,那么这边进行了一个拼接,可以看到最前面这个单引号和后面这个单引号是我们传入的,这单引号和它原本的一个单引号进行了一个闭合,这就是一个整体。
然后这边这边就是或者的意思,或者1=1,这边也是我们传入的对吧?这个单引号等于1,这边也是我们传输的,然后它自带的一个单引号就在这儿,和我们最后传入的这个进行了一个闭合,因为1=1它是一个成立的语句,它是不可能报错的,不可能返回一个false。那么在这儿他就已经达到了我们想要的一个效果,不需要密码就可以进入它的一个后台,也就是所谓的SQL注入。