一、SQL注入原理


SQL注入简单原理
*

二、常见的SQL注入类型

注:?为php语言中的输入符

(1)、按注入点区分:
1、数字型注入
数字型注入主要存在于网站的url中有?id=处,如:http://xxx.com/index.php?id=1 通过改变id=的数值来判断是否有注入点,一般常见测试手段是令id等于一个不常见的大数,通过页面是否变化来判断是否存在注入点。

2、字符型注入
字符型注入常见于用户登录页面或页面url中有?username=aaa 或者?password=aaa 如:http://xxx.com/index.php?username=aaa&password=bbb,对于字符型注入,常见的手段为通过闭合符和注释符的配合,绕过用户名和密码,直接获取数据库里的账号信息。前文http://xxx.com/index.php?username=aaa&password=bbb的sql语句为select * from 表 where username=‘aaa‘ and password=‘bbb‘,而进行字符型注入时,可将url修改成,http://xxx.com/index.php?username=aaa ’ and 1=1’** **–+****&password=bbb,此时通过 ’ 的闭合和–+的注释,生产的sql语句为 select * from 表 where username=‘aaa’ and 1=1 ’ 由于1=1为永真,数据库就可能返回相关信息。

3、搜索型注入
搜索型相比于数字型和字符型而言,较为特殊点,主要是进行搜索时网站没过滤搜索关键字,常见于url中的 “keyword=” 。生成的 SQL 语句:select * from 表 where 字段 like ‘%关键字%’ ,注入时,可以构造sql注入语句:select * from 表名 where 字段 like ‘%关键字%’ and ‘%1%’=‘%1%’,进行注入。

(2)、按提交方式区分
访问网站时,浏览器只是一个传输和接收数据的工具,那么就需要将用户的操作生成数据包提交到服务器中。
1、GET 注入
按提交方式区分的话,GET注入是最简单的注入,不需要额外的工具。GET提交数据的方式的特点是将用户操作生成的语句直接显示在url上,常见于不需要保密传输的页面。GET 注入点的位置一般在参数部分。如URL为:http://xxx.com/index.php?id=1 , id =输入的内容可能是注入点。

2、POST 注入
使用POST提交的页面通常需要一定的保密性,常见于用户登录页面,用户操作生成的语句不会直接显示在url中,而是会存在于表单中,需要通过抓包才能获取,常用抓包神器BurpSuite,或者可以使用火狐浏览器通过安装hackbar等拓展抓包。抓取数据包后,可以通过修改提交的内容,结合网站页面反馈,判断能否注入。

3、Cookie 注入
Cookie,存在用户本地客户端的数据集合,HTTP 请求表单中会带上客户端的 Cookie, 注入点存在 于Cookie 当中的某个字段中。和POST一样,Cookie也要通过抓包来查看。

(3)、按页面执行反馈区分
此种注入主要是因为页面不直接反馈注入操作的内容,而常要配合各种sql函数进行,如sleep(),if(),ascll(), length()等,通过页面的反馈情况判断注入操作效果。
1、布尔注入
很多时候,sql服务器并不会直接反馈查询内容,而是通过反馈一个布尔参数给网站服务器,然后再由网站服务器将内容反馈到浏览器,也就是用户眼前,而布尔类型只有两个参数,ture和false,此时可通过配合猜解函数如sleep(),if(),ascll(), length()等,来判断注入操作的效果。
2、时间注入
和布尔注入一样,由于不直接反馈出入操作的内容,从而通过执行时间来间接猜解注入效果。常用sleep()、if()、ascll()的等函数猜解,如:if(length(database()) =8,sleep(5),sleep(0))意为:如果数据库的长度等于8,那么页面休眠5秒,否则不休眠。页面休眠一般指页面处于正在刷新状态。
3、基于报错注入
页面反馈操作的错误信息,有的会直接把错误的sql语句反馈在页面中。
常见报错注入点在:单/双引号、数字型注入


三、总结


通过上述,可以一个sql注入既可以是数字型注入,同时也可以是get注入和报错注入,这也正如实际上的sql注入并不是一成不变的,毕竟sql注入存在的原因就是网站开发者在开发时的 疏忽,而人与人之间的疏忽不可能是相同的,而是千奇百怪,千差万别的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐