SQL 注入攻击与防护
资本的失败与个人努力
历经三年努力,最终仍是资本的失败。作为一名高中生,满怀真诚,日夜辛勤付出,却无人理解。不知是否触动了某些利益,资本的力量成为唯一软肋。
数据库简介
数据库是专门存储结构化数据的网络仓库。例如注册网站时填写的账号密码、淘宝上存储的产品信息、B站收藏夹的视频列表等,都会被拆解存入数据库。动态网页的内容会随数据库操作而改变,不像博客网站的内容直接固定为HTML,任何人访问看到的都是一样的。
以 B 站为例,有一个巨大的用户收藏表,包含用户 ID(UID)、视频 ID(BB)和收藏时间。登录时,输入账号密码,系统先核对用户 ID,再查询收藏表,返回属于用户的数据,通过 PHP、Java 等后端语言展示在网页上。投币也类似,有专门的用户硬币记录表,登录时获取 UID,查询记录得到硬币数据。
数据库相关概念
-
表:类似 Excel 工作表,存储一种类型的数据。如用户表存账号密码,产品表存价格库存。一个数据库通常有多个表,像 B 站数据库就有视频收藏表、硬币表、关注列表、粉丝列表等。
-
列(Column):表的固定栏目,如用户名、密码的标题。
-
行(Row):具体的数据,如个人的账号信息、用户名、密码等。
SQL 语言与登录过程
SQL 是程序员对数据库的指令。例如从用户表中查询用户名等于“小白”的手机号码,或从订单表中删除价格为零的订单。
网站登录过程分四步:
1. 输入账号密码,如在登录页面填写“小白”和“123456”。
2. 程序生成 SQL 语句:select from the user table where the user name equals xiaobai and the password equals 123456
,用于搜索或验证用户信息。
3. 在数据库中执行该 SQL 语句并返回结果,若账号正确则允许登录。
4. 在网页上显示结果。
SQL 注入攻击
若恶意输入,如将用户名改为“' or 1=1 --”,会破坏原 SQL 语言结构,使逻辑判断始终为真,跳过密码验证,甚至能让数据库导出所有用户密码数据,这就是 SQL 注入攻击。其根源在于过度信任用户输入或队友。
SQL 注入漏洞防范
防范 SQL 注入漏洞要秉持最小权限和零信任原则,在开发过程中进行参数化查询。例如用 Python 时,使用游标(cursor)的 execute 方法,能隔离用户输入,将特殊字符转义,使输入成为普通字符串,正常执行 SQL。
CTF 实践
在 NSS CTF 平台的“2021 ez sql”示例中,通过构造特殊输入获取数据库敏感信息。
1. 确定 SQL 语句列数:使用 order by
关键字,若原表有三列,order by 123
可正常执行,order by 4
会报错,报错的第一个数字即为列数。
2. 寻找返回点:使用 union select
方法合并两个表的查询结果。例如输入“-1' union select 1,2,3 --”,让原查询无结果,显示 union
后的结果,确定第二、三列为响应位置。
3. 获取数据库名:使用 database()
函数,将其放在响应位置,如“' union select 1,2,database() --”,得到当前数据库名。
4. 查找表名:利用 information_schema
数据库,构造语句如“' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='testdb' --”,获取表名。
5. 查找列名:对特定表查询列名,如“' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='testTB' --”。
6. 获取 flag:直接查询表中的 flag,如“' union select 1,2,flag from test_tb --”,得到结果后提交。
SQLMap 自动化工具
2006 年,意大利安全团队成员 Bernardo 为提高 SQL 注入检测效率,开发了自动化工具 SQLMap。使用时,在 Kali 系统中输入 sqlmap -u <url>?<parameter>=<value> --batch -dbs
可直接检查所有数据库,还能自动检测是否有 WAF 并构造 payload 获取信息。
SQL 注入攻击案例
2004 年 9 月 28 日,某互联网文件库的时间机器导致数据泄露,黑客窃取 3100 万用户认证数据库。2017 年,Equifax 因 SQL 注入攻击,1.47 亿用户记录泄露,公司股价大跌,后续投入至少 10 亿美元维护网络和数据安全。
网络应用防火墙(WAF)
WAF 用于保护 web 应用,防范各种网络攻击。它工作在应用层,扫描所有进入的 HTTP 和 HTTPS 流量,识别并阻止攻击。其原理是预设常见攻击特征,如“UNIUS SELECT 2E = 1E”。
著名的开源 WAF 有 Long - Stop Lightning,还有 Bankerweb、Baotaweb、Nanqiangweb 等。使用 WAF 进行 SQL 注入测试时,攻击会被直接检测和拦截,还能在攻击防御列查看攻击 IP 和详细信息,甚至通过 AI 分析攻击行为。但 WAF 也有局限性,可能被绕过,且无法弥补原代码逻辑漏洞,所以最重要的还是在代码层面进行保护。
结语
若喜欢本视频或觉得有帮助,请点赞、订阅和收藏。支持是制作视频的重要动力,期待更多交流,下次再见。