SQL注入(Structured Query Language)
OWASP 开放式web应用程序安全项目
OWASP TOP10(4年更新一次,上次更新是2017年。)
- 注入
- 失效的身份认证
- 敏感信息泄露
- XML外部实体(XXE)
- 失效的访问控制
- 安全配置错误
- 跨站脚本(XSS)
- 不安全的反序列化
- 使用含有已知漏洞的组件
- 不足的日志记录和监控
什么是SQL注入
sql注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令目的的入侵行为。
注入能导致数据丢失、破坏或泄露给无授权方,缺乏可审计性或是拒绝服务。注入有时甚至能导致主机被完全接管。
注入攻击的本质:
注入攻击的本质就是把用户输入的数据当作代码执行。(过于信任用户)
SQL注入攻击的本质:
SQL注入实质就是闭合前一句查询语句,构造恶意语句,恶意语句被代入SQL语句执行。
SQL注入产生的原因:
没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断,导致了攻击者可以提交一段数据库查询代码,根据程序返回的结果,获得一些他想得到的数据。这样就产生了被称为数据库的注入攻击SQL注入攻击。
数据与代码未严格分离;用户提交的参数数据未做充分检查过滤即被代入到SQL命令中,改变了原有SQL命令的“语义”,且成功被数据库执行。
SQL命令可以进行查询、插入、删除等操作,直接将这些命令拼接起来。
SQL注入的危害(包括但不限于):
- 数据库信息泄露
- 网页篡改
- 网站被挂马
- 数据库被恶意操作
- 服务器被远程控制,被安装后门
- 破坏硬盘数据,瘫痪全系统
- 一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大
SQL注入在渗透中的利用:
- 绕过登录验证:使用万能密码登录网站后台等
- 获取敏感数据:获取网站管理员账号、密码等
- 文件系统操作:列目录、读取、写入文件等
- 注册表操作:读取、写入、删除注册表等
- 执行系统命令:远程执行命令
存在万能密码,一定存在注入
存在注入,不一定存在万能密码
存在时间注入,一定也存在布尔注入
存在布尔注入,不一定存在时间注入
哪些地方存在SQL注入:
搜索框、输入框
参数名,参数值,cookie,目录名,文件名...
(cookie注入一般存在于asp的程序中。
参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。)
SQL注入漏洞分类:
数据类型:数字、字符
返回结果:显错(报错)、盲注(布尔、时间)
判断注入漏洞的依据是什么?
根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。
判断存在SQL的常用步骤:
字符型:(假如入有一篇 id=1 的文章)
- id=1' //报错(程序无法正常从数据库中查询出数据,就会抛出异常)
- id=1'+and+'1'='1 //页面有返回(语句为真,语句执行正常,与原始页面无任何差异)
- id=1'+and+'1'='2 //页面有返回(语句为假,语句执行失败,与原始页面也有差异)
(闭合查询语句前后单引号)
数字型:
- id=1
- id=1+and+1=1
- id=1+and+1=2
快速的判断是数字型注入的方法(id=1/0 id=1/1(观察页面的变化))(四则运算)
时间盲注:
id=1'+and+sleep(5)+--+
sqlmap基本用法:
- sqlmap -u ---指定url连接
- sqlmap -r ---指定get/post数据包
例子:
python sqlmap.py -u "http://127.0.0.1/fwxm_detail.asp?id=22"
python sqlmap.py -r c:\2.txt - --cookie 设置cookie
- --current-db 获取当前数据库名称
- -D "" 指定数据库名
- --tables 列出表
- -T "" 指定表名
- --columns 列出字段
- -C "" 指定字段
- --dump
- --dbs 列出所有数据库
- --users 列出数据库用户
- --password 列出数据库用户的密码
- --is-dba 查看数据库用户的权限
手工注入的思路:
- 报错
- 联合查询注入(union注入)
- 。。。