2019 年 10 月 13 日修改少许

引例之万能密码

用户名: admin' or '1 --

密码:

原理:sql 注入(服务端漏洞)

什么是 SQL 注入?

SQL Injection 是一种常见的 Web 安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。

  1. 正常的 Web 端口访问

    正常访问是 web 出啊如程序设计者所希望的参数值,由程序查询数据库完成处理后,呈现结果页面给用户。

  2. SQL 注入是如何访问?

    1)SQL 注入也是正常的 web 端口访问

    2)只是传入的参数值并非是程序设计者所期望的,而是传入了嵌套 SQL 代码的参数值

    3)参数值利用程序处理注入这的逻辑,按照注入者的期望执行数据库查询

    4)甚至页面呈现按 SQL 注入者期望显示

SQL 注入:是通过应用程序把带有 SQL 代码的参数传递给数据库

万能密码回顾:

登录请求通常使用 post 方式提交表单,服务器通过 PHP 获取用户名与密码,然后拼接为 sql 语句,然后从用户表中查询用户名[用户输入的用户名], 密码为[用户输入的密码的 MD5](一般使用 MD5 加密),执行成功,就返回用户名表示登陆成功。

而处理万能密码时,闭合、注释,使得只要数据库的对应表中存在该用户名时,便执行成功,登陆成功。

总结:

  1. 获取用户请求参数
  2. 拼接到代码中(这个拼接过程很重要,正是这个过程处理不恰当,使得数据与代码的界限混淆)
  3. SQL 语句按照我们构造参数的语义执行成功。

SQL 注入的必备条件:

  1. 可以控制输入的数据
  2. 服务器要执行的代码拼接了控制的数据

SQL 注入的原因

根本原因:

SQL 注入是应用程序的问题,而不是系统或者数据库的问题。其本质是人对数据安全的意识薄弱或者即使有安全意识而程序员对如何防范无从下手。因此,导致程序没有对用户的输入数据的合法性进行检查,对传入参数的安全性没有恰当的过滤。

技术原因:

数据和代码未分离,即数据当做了代码来执行。(用一句不太严谨的话来说,当程序对客户端提交的数据未作处理或转义直接代入数据库就造成了 SQL 注入)

解决方案:数据与查询模块独立处理。

SQL 注入的危害

  1. 获取数据库信息
    1. 管理员后台用户名和密码
    2. 获取其他数据库敏感信息:用户名、密码等
    3. 脱库
  2. 获取服务器权限
  3. 植入 Webshell,获取服务器后门(select into outfile 或 mysql 日志写 webshell)
  4. 读取服务器敏感文件
  5. 万能密码

感想:

目前,互联网上 sql 注入也存在不少(不过,互联网毕竟都这么大。。),因为仍然有很多网站开发者,管理员等安全意识、安全开发技术不高等。但整体上,人们对于网络的安全意识已经提升了很多,相比以前,网络安全已经进了一大步。由于 sql 注入的一些特点:形式简单、危害大、好复现、好修复等,很多有些安全意识的,没能力的上乙方的 WAF,有能力的自己研发安全产品,使得 sal 注入比较少出现了。(在那些有安全意识的厂家)。但是,道高一尺,魔高一丈,很多 WAF 产品本身设计或过滤等就存在缺陷,基础的绕过不行,我们还有高级的绕过方式,所以说门槛高了,要学的多了。