SQL注入漏洞

SQL注入原理

SQL注入漏洞形成原因:用户输入的数据被SQL解释器执行,一般是直接拼接SQL造成的。
SQL注入的危害:脱库,修改数据,管理数据库,写入文件,泄露用户信息,执行命令等。
示例:
原始SQL:

select * from users where username='$username' and password='$password'

用户提交数据:$username = 1’ or ‘1’ = ‘1; $password = 1’ or ‘1’ = '1

select * from users where username='1' or '1' = '1' and password='1' or '1' = '1' 

SQL注入分类

SQL注入分为数字型与字符型。
因为对数据库进行数据查询时,输入数据一般两种:数字型,比如where id = 1;字符串型,比如 where name = ‘root’。post注入、Cookie注入、盲注、延时注入、base64注入等都可以归纳为数字型注入或者字符型注入。
攻击者对数据库注入,无非是利用数据库获取更多的数据或者更大的权限,一般利用方式可以分为几大类:

  • 查询数据
  • 读写文件
  • 执行命令
    复杂查询语句中,where,order by 等地方直接拼接用户输入,忘记过滤会有SQL注入风险。

SQL注入漏洞利用工具

  • SQLMap:开放源码的渗透测试工具,可以自动检测和利用SQL注入漏洞。
    1) 数据库支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase 和 SAP MaxDB;2)SQL注入类型包括SQL盲注、UNION注入、显错式注入、时间盲注、堆查询注入等技术;3)支持枚举用户、密码哈希、权限、角色、数据库、表和列;4)支持执行任意命令;5)自动识别密码加密方式,并且可以使用字典解密;6)支持数据导出功能。
  • Pangolin(穿山甲):一款帮助测试人员进行SQL注入测试的安全工具。
    1)数据库支持 Access、DB2、Informix、Microsoft SQL Server 2000/2005/2008、MySQL、Oracle、PostgreSQL、Sqlite3和Sybase;2)自动关键字分析能力能够减少人为操作,判断结果更准确;3)预登录功能,在需要验证的情况下继续注入;3)支持HTTPS;4)自定义HTTP标题头功能;5)丰富的绕过防火墙过滤功能;6)数据导出功能;7)可视化界面,测试过程简单、易操作
  • Havij:一款自动化的SQL注入工具,与穿山甲一样拥有友好的可视化界面,操作类似穿山甲。
    1)数据库支持SQL Server、MySQL、Access、Oracle;2)支持参数配置以躲避IDS;3)支持代理;4)后台登录地址扫描。

SQL注入防御

  • 严格的数据类型:尤其是像PHP这样的弱类型语言,使用is_numeric、is_int等函数判断数据类型,即可解决数字型注入。
  • 特殊字符转义:字符型注入中必然会出现单引号等特殊字符,将这些特殊字符转义即可防御字符型SQL注入,MySQL使用""转义。
  • 预编译语句:Java、C#、PHP等语言都提供预编译语句。如PHP操作PG数据库,$sql_param = array($param['name'], $param['value']); $insert = $conn->prepare("INSERT INTO users (name, value) VALUES (?, ?)"); $result = $insert->execute($sql_param);
  • 框架技术:Java、C#、PHP等语言都有自己的框架,有一类框架专门与数据库打交道,被称为持久层框架,比较有代表性的有Hibernate、MyBatis、JORM等。
  • 存储过程:在大型数据库系统中,一组为了完成特定功能或经常使用的SQL语句集,经编译后存储在数据库中,存储过程具有较高的安全性,可以防止SQL注入,但若编写不当,依然有SQL注入风险。如create proc findUserId @id varchar(100) as exec('select * from Student where StudentNo= '+@id); go,findUserId虽然是存储过程,但exec执行SQL语句和直接书写select * from Student where StudentNo = id没有任何区别,传入参数3 or 1=1 依然能查询出所有数据。改为:create proc findUserId @id varchar(100) as select * from Student where StudentNo=@id; go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值