目录
什么是SQL注入?
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。
由于服务端不安全、不完整的过滤,导致不应该非法的数据被带入,比如单双引号等导致前面语句闭合,后面就可以随意写恶意语句。
(1)SQL注入原理
服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。
(2)注入的两个条件
- 用户能够控制输入
- 原本程序要执行的SQL语句,拼接了用户输入的恶意数据
(3)MySQL中的注释
- - #号-->一般需要进行编码=%23
- - -->
- - /* */
(4)SQL注入的过程
- 攻击者访问有SQL注入漏洞的网站,寻找注入点
- 构造注入语句,将注入语句和程序中的SQL语句结合生成新的SQL语句
- 提交生成的新SQL语句到服务器的数据库中
- 数据库指向有注入语句的SQL语句,引发SQL注入攻击
(5)SQL注入带来的危害
- 绕过登录验证:使用万能密码登录网站后台等
- 获取敏感数据:获取网站管理员帐号、密码等
- 文件系统操作:列目录,读取、写入文件等
- 注册表操作:读取、写入、删除注册表等
- 执行系统命令:远程执行命令
- 最重要的危害:数据丢失
(6)万能密码的原理
- 通过在用户名处传入参数'or 1=1 --进行万能密码登录
- 实际查询语句:SELECT * FROM users WHERE username = **" or 1=1 --** AND password = 'anything';
- 使用or连接两个条件,无论前一个条件对不对,只要保证后面的条件恒为真时,就能正常执行查询语句
- 相当于:SELECT * FROM users ;
(7)判断是否存在SQL注入
-
?id=1 and 1=1(确保and前后条件都为真)
-
?id=1 '(加单双引号)
-
数据库函数(布尔盲注/时间盲注)sleep((3),0) 若为真则暂停3
-
length()函数判断
SQL注入的类型
(1)字符型
传过来的数据使用单双引号包裹起来,所以需要进行单双引号闭合。
案例sqli-labs第