![7247399e7e816b05ec9a2da54001581d.png](https://i-blog.csdnimg.cn/blog_migrate/c0ffa46300d17b9c8c433b968e5358e0.jpeg)
什么是SQL注入?
Web应用程序在向后台数据库传递SQL语句查询时,如果攻击者可以影响该查询的能力,就会引发SQL注入!
(缺乏对用户输入数据的合法性检查,传递的参数是可控的,则可以构造不同的SQL语言,来实现对数据库的操控!)
SQL注入的产生过程
- 开发人员在运行程序过程中,动态构造SQL语句(字符串)!
![9d1dffb23764bb3c8cf5fee5fe4424dd.png](https://i-blog.csdnimg.cn/blog_migrate/d76d3c94515f0b194c0e0213dd9772cc.jpeg)
转义字符处理不当
SQL数据库会将单引号(')解析为代码与数据的分界线:
![b735f633f51d5789d5e630b933f505ec.png](https://i-blog.csdnimg.cn/blog_migrate/f10bbf26d5ddb448c98e5d6a967f7c5c.jpeg)
输入框输入:tony
user_id = 'tony' // 数据(参数)外面会自动加上单引号,单引号外面是运行的代码!因此输入框只要输入('),就能判断是不是存在SQL注入!user_id =''' // 会提供SQL语法错误!因为它把(')解析为字符串分隔符,相当于多出来一个('),所以报错!
构造自己的查询语句:
1' and 1='1 相当于:user_id ='1' and 1 = '1' // SQL语句可以正常执行!(没有语法错误!)
在Oracle数据库中,还有"空格","||",",",".","*/","""(双引号)等等具有特殊含义的转义字符,我们可以利用其特殊含义,去拼接要执行的SQL语句!
类型处理不当
加入查询的数据(参数)为数字类型,开发人员不会在数字类型外面添加单引号!
比如:
user_id = 1
攻击者在构造SQL语句的时候,没有必要使用单引号来转义查询:
user_id = 1 and 1=1
所以,攻击者常常使用1' and 1='1和1 and 1=1来判断查询的字段是数字类型还是字符类型!(具体判断,下文会提及!)
查询语句组装不当
开发人员在构造动态SQL语言中,以表名或字段名作为查询参数,这样的组装容易导致攻击者使用自己的表名和字段名来替换查询,比如GET请求查询,替换URL中的表名和字段名!
http://www.tony.com?table=users&column1=user&column2=password
导致了users表中的字段user和password的信息泄漏:
![da07af47879c85c8943c80497440c9ad.png](https://i-blog.csdnimg.cn/blog_migrate/3d57f70772dd3c29b577ab465c72bdf4.jpeg)
错误处理不当
开发人员将详细的错误消息显示在页面上!
攻击者可以根据错误消息来提取有用信息:
![cb37e3e104fb51535f8b02596f947e22.png](https://i-blog.csdnimg.cn/blog_migrate/ae4cfe4d892162cb629bf1a30a8b2b78.jpeg)
利用:
根据报错信息,不断变化order by后面的数字,来获取表中的字段数!
![84e0027f0fb3d93c6eef76ecd0ecb1f1.png](https://i-blog.csdnimg.cn/blog_migrate/f02d17c56b4c97ca0989909a91498df5.jpeg)
- 不安全的数据库配置
保证应用程序的代码的安全是首要任务,但也不能忽略数据库本身的安全!
MySQL:使用root和anonymous用户账户!
Oracle:默认创建的数据库 - SYS,SYSYTEM,DBSNMP,OUTLN等,并且密码也默认!
SQL Server:用sa作为数据库系统管理员账户!
安装数据库服务时,允许以root,sa,SYSTEM等特权用户来执行操作,一旦数据库遭到攻击,破坏力太大!
没有对元数据的访问设置权限!(元数据指数据库系统内部包含的数据,比如数据库名,表名,列名,访问权限等信息)
寻找SQL注入点
(操纵用户数据输入并分析服务器的响应来寻找SQL注入漏洞!)
- 源代码
- 借助推理进行测试(可以利用BurpSuite中的重放功能,向服务器发送不同请求,根据服务器的响应来推断!)
注意:借助推理进行测试,最好发送一些意外请求,来触发服务器异常:
- 识别Web应用上的所有数据输入(如POST、GET、Cookie等!)
- 哪种类型的输入会触发异常
- 检测服务器响应中的异常
举例:
http://www.tony.com?name=tony // Get请求
确定name=tony,是select,insert,update,delete中的哪一种?
构造:('或变化不同的参数,通过不同的响应结果来判断!)
name=或name=tony' // 不同响应,select!name=tony或name=to' 'ny // 相同响应,很可能存在SQL注入!(两个单引号中间是空格!)
根据不用的响应异常,可以大概率推断是select,并存在注入点,这时可以拼接SQL语句来进行攻击!
- 数据库错误
用户请求,触发数据库错误时,开发人员会根据应用编码方式的不同,作如下处理:
- SQL错误显示在页面中,对浏览器用户可见!
- SQL错误隐藏在页面源代码中,便于调试!
- 检测到错误时,跳转到另一个页面!
- 返回HTTP错误码,如500,或HTTP重定向码302
- 适当地处理错误但不显示结果,或者可能显示一个统一的错误处理页面!
- 应用程序的响应
寻找SQL注入漏洞的过程包括识别用户数据输入、操纵发送给应用的数据以及识别服务器返回结果中的变化,但操纵参数产生的错误可能与SQL注入无关!
如:统一错误处理页面,根本觉察不了什么异样!
所以,要弄清楚该错误到底是不是由SQL注入引发的!
方法:
插入不触发应用错误的SQL代码测试!(反复训练和不断尝试的过程!)
or '1' ='1'
or '1' ='2'
HTTP代码错误
200:成功接收
500:内部服务器错误
302:当发现错误时,重定向到首页或自定义错误页面!
(意味着,我们已经以某种方式干预了应用的正常行为!)
不同大小的响应(通过BP很容易捕获到!)
注意:SQL盲注常利用这个错误!
- SQL盲注
Web应用访问数据库,会把结果呈现给用户!
攻击者修改SQL语句,通过响应来获取数据库中的任意信息!
(需要发送多次请求,建议在BP中操作,修改参数,重放请求!)
修改参数需要注意:
id=1+1
+:在URI中时保留字,不能直接使用,需要进行URL编码!
%2B=+号的URL编码!
id=1%2B1 // 对id=1+1进行了URL编码!
确认SQL注入
构造一条有效SQL语句来确认SQL注入漏洞!
(执行的这条SQL语句,不会引发任何错误!)
区分数字还是字符串
数据库有不同的数据类型,用于不同的表示方式:
- 数字型(不要使用单引号)
- 字符型(需要使用单引号)
如何判断?
数字型:
- 输入单引号('),返回不正常!
- 输入 and 1=1,正常返回!
- 输入 and 1=2,不正常返回!
(具体有没有数字型注入,是否能够通过数字型注入获取有效的信息,还需要大量的测试来验证!)
字符型:
- 输入单引号('),返回不正常!
- 输入 ' and '1'='1,正常返回!
- 输入 ' and '1'='2,不正常返回!
(具体有没有字符型注入,是否能够通过数字型注入获取有效的信息,还需要大量的测试来验证!)
SQL注入方式
这里以MySQL数据库为例,至于其他数据库如Oracle,SQL Server,Access,PostgreSQL等,到时候再整理吧!
MySQL前置知识:
MySQL 5.0之后,MySQL默认在数据库中存放一个“information_schema”的数据库,该库中存放着这三张表:
1. SCHEMATA:存储该用户创建的所有数据库的库名,记录库名的字段为SCHEMATA_NAME。
2. TABLES:存储该用户创建的所有数据库的库名和表名,记录库名的字段为TABLE_SCHEMA,记录表名的字段为TABLE_NAME。
3. COLUMNS:存储该用户创建的所有数据库的库名、表名、字段名。记录库名的字段为TABLE_SCHEMA,记录表名的字段为TABLE_NAME,记录字段名的字段为COLUMN_NAME。
limit:limit m,nm:记录开始的位置,0代表第一条记录n:取n条记录limit 0,2:第一条记录开始,取两条记录!
常用的函数和属性:
version():查询MySQL的版本
database():查询数据库名
user():查询使用MySQL的用户
@@datadir:查询数据库物理路径
@@version:查询MySQL的版本
MySQL的4种注释:
1. # 我是注释
2. -- 我是注释 (--和我是注释之间有空格)
3. /*我是注释*/
以上注释都可以放在SQL语句的任意位置中!!!
4. /*!code*/ (内联注释)
内联注释可以用于整个SQL语句中,用来执行SQL语句!
例如:userid=1/*! UNION*//*! SELELCT*/1,2,3,4
基本注入
- 联合查询注入(union)
利用union可以同时执行多条SQL语句的特点,在参数中插入恶意的SQL注入语句,同时SQL语句,来获取额外敏感信息等操作!
![33fe5f4470717fcb18b42fa686da5ab4.png](https://i-blog.csdnimg.cn/blog_migrate/4df9cb3d039cd2fbfaa32aff39dec6bd.jpeg)
![497eca706ecf112c539b96e30ddfa5aa.png](https://i-blog.csdnimg.cn/blog_migrate/7aff3a2a6f03e7b38e0c634621f90741.jpeg)
分析:
select 1,2,3会生成一张临时表,表中的字段为查询的字段,内容也是查询的字段
select 1,2,3 union select 3,2,1,同样生成一张临时表,表中的字段为union左边查询的字段,内容为union左右两边查询的字段!
如果不想显示左边的查询数据,只要左边的查询结果为假,就不会显示数据,比如:and 1=2或user_id=-1,这样只显示右边的查询数据!
联合查询,需要保证两表的列数相同和列的数据类型相同:
数据类型相同,通过数字来表示。
列数相同
联合查询可以跨库跨表查询!
查询步骤:(DVWA中的SQL注入为例子!)
![f8943066e67b7a01554d7e9fb3b194f5.png](https://i-blog.csdnimg.cn/blog_migrate/1bc4dfdddc8851694b5755c518ea00ed.jpeg)
![a6d5ead8793a914290726a479c2ba475.png](https://i-blog.csdnimg.cn/blog_migrate/38a725b1099e1eb157ba538218b62efc.jpeg)
![37847b5eff2b0b140c6037369a97870c.png](https://i-blog.csdnimg.cn/blog_migrate/2007a6c43d7031a672e381550ad76370.jpeg)
列数:2
![23473a3f97f8c8dff8705c655dadcd47.png](https://i-blog.csdnimg.cn/blog_migrate/f15c8b60be2d20fad94ede082527559d.jpeg)
![4b03e44865d4132370a2764502aa834b.png](https://i-blog.csdnimg.cn/blog_migrate/b2b3c41829c7711e8f93839df0a990fd.jpeg)
![7bdca31bd60d965895e84012ba645e00.png](https://i-blog.csdnimg.cn/blog_migrate/eee96f5086072d337b0ac4b41aa8e61a.jpeg)
![b6f08c0cf4a16605f814568ffaf88b92.png](https://i-blog.csdnimg.cn/blog_migrate/1d8087dd643056c3ed4b45ab0d37b3db.jpeg)
![68c9a7a7aaf37103befbdbbab9bcbf9d.png](https://i-blog.csdnimg.cn/blog_migrate/a8b73b504a9d011731bbd50885b5203d.jpeg)
![84cfba59200dfec8f602411ee74ea595.png](https://i-blog.csdnimg.cn/blog_migrate/bf443c5cf95fca173b51b3c8d125f009.jpeg)
![a38b262e79f6ccd0b650fd7ab7d3763f.png](https://i-blog.csdnimg.cn/blog_migrate/16852a58832717a249327a3d6838a3bc.jpeg)
源代码中,会将查询到的ID,First name,Surname输出到页面中,这就是可以利用union select语句来查询出其他数据的原因!
- 布尔注入(bool)
bool注入没有任何报错信息输出,页面返回只有正常和不正常两种状态!
![73b731be24d101fb3f0fecc6a44ba0cb.png](https://i-blog.csdnimg.cn/blog_migrate/4d905e398e20b7876a3f1a9994992115.jpeg)
![8cca8ecf06e9287a228e799f9a3a8b08.png](https://i-blog.csdnimg.cn/blog_migrate/88562470018a28be36ba92d73dd2806c.jpeg)
![aac4c89e4070d40602767856999d3bac.png](https://i-blog.csdnimg.cn/blog_migrate/15379dce405f8f7684dc473196a255a7.jpeg)
![0c1a0b832d1e59f3fc735b4cc3d31a29.png](https://i-blog.csdnimg.cn/blog_migrate/e8524c0b7776c5e7730f1bb7c6452a36.jpeg)
![3533f01f863a3e3f0deafe9825d88b68.png](https://i-blog.csdnimg.cn/blog_migrate/c6f2c74c97feea887f9c226961dedc1e.jpeg)
![7452bcff19c152fc6cb2a1387fd337b8.png](https://i-blog.csdnimg.cn/blog_migrate/0545bd2744cc03da51304081981e6bba.jpeg)
![210954049f04d72600abfaa6516ffcca.png](https://i-blog.csdnimg.cn/blog_migrate/96f8b04ee31c84d75df05555a4434d4c.jpeg)
![20c314fad5192baaa7e05c53c37116a4.png](https://i-blog.csdnimg.cn/blog_migrate/3cecf281aff16e9c49e2e09967f02ba3.jpeg)
![600be258aa4cdf781eeef962dc9a1a01.png](https://i-blog.csdnimg.cn/blog_migrate/c18b43c7499192cc72f08ce681c97d59.jpeg)
![14ef20db45afdd688cef8d34becf18ca.png](https://i-blog.csdnimg.cn/blog_migrate/8948a3d04e8d1bc15feafd11f8e7d3a5.jpeg)
![c3a5d73c283ba466cbe20cc4b593827e.png](https://i-blog.csdnimg.cn/blog_migrate/352a1d1b45e617c9bf1625cb432cde34.jpeg)
![2bff5f9d087fd1f30b0e9e6629096208.png](https://i-blog.csdnimg.cn/blog_migrate/46b836f4e0096945569464b450299e72.jpeg)
使用BurpSuite爆破数据库名:
![c9f317d80993a466af85f1067e9ef327.png](https://i-blog.csdnimg.cn/blog_migrate/83969fd036fc7d53eab08dfda6ae303d.jpeg)
![888206964fab7dadc5995432337eb4a1.png](https://i-blog.csdnimg.cn/blog_migrate/638aeaf0c6dda42b7bfd1013dd960722.jpeg)
![4ae4985a9144f32576a0b0511f0e0847.png](https://i-blog.csdnimg.cn/blog_migrate/782c2b0a0d6f7c0e9bbd39d78ad8edd1.jpeg)
![060e5c9cc4fd045921d0c155c4effc65.png](https://i-blog.csdnimg.cn/blog_migrate/b5e23e0e80da4c87cd632cd1b538fc94.jpeg)
![9ed46857217c7f86bb71f6d060f1f504.png](https://i-blog.csdnimg.cn/blog_migrate/58927e78efc55befb355be7bc8eee877.jpeg)
![d9b6e053a2526c1af8a4da298616db9f.png](https://i-blog.csdnimg.cn/blog_migrate/9578e78f228c484b451a0cda6abe7578.jpeg)
![70ff65ffc3e963066e46160d60886770.png](https://i-blog.csdnimg.cn/blog_migrate/2309aad6bb4256f7fdc5a35c4079a8bb.jpeg)
![d9fbf5fd23e0f7b3568967f8e0f111ec.png](https://i-blog.csdnimg.cn/blog_migrate/5bd0865d8da2e95ca1d4190c8d3d0bff.jpeg)
使用BurpSuite爆破指定数据库的表名:
全部表:
![7de524f7ab9a5a90e7d6a8c13bc85daf.png](https://i-blog.csdnimg.cn/blog_migrate/c21f0e8ea15e9915e696a062f70b31d4.jpeg)
![1c75efe7d023fd2b5c77e98b3f719bb3.png](https://i-blog.csdnimg.cn/blog_migrate/edfe4477988b178a813b6e766692b678.jpeg)
![6c32e553e16bad33ac9cfdc8635c2049.png](https://i-blog.csdnimg.cn/blog_migrate/9dc20e3f546218361234cb921742f654.jpeg)
![51494f8648ae3891cb10b55349b0ab35.png](https://i-blog.csdnimg.cn/blog_migrate/8e8695523b19f1ebdd5176f13318ba31.jpeg)
![f68288a0ce343963ab0dc3b4d455e723.png](https://i-blog.csdnimg.cn/blog_migrate/f893541e40d541005eb2bc7d0d3aa767.jpeg)
![4e064f65b498306ef72f6734d4142e63.png](https://i-blog.csdnimg.cn/blog_migrate/a6b82971ad0a291be4ce7e3b397edb38.jpeg)
爆破结果出来了,但无法过滤出表名!(设置了3个参数!)
单表:
![4b29452b36593c41005934e3cc7fa4e9.png](https://i-blog.csdnimg.cn/blog_migrate/02d8ac699b8b97899abe2a8dc72e709e.jpeg)
![753452b1b70b78d5e5c3e530559ac3b3.png](https://i-blog.csdnimg.cn/blog_migrate/59dafb04fefff4f9466d3386c1e3f13f.jpeg)
![5edcb0d449c4fec93a5212a64d8512a7.png](https://i-blog.csdnimg.cn/blog_migrate/091f54eea2df62fe8f73595b02ae7e7d.jpeg)
![2fa5b1c940ee36f51996d7d9b2d38daa.png](https://i-blog.csdnimg.cn/blog_migrate/35cd51802235e389db27e502a0facc49.jpeg)
- 报错注入
...... (续篇中分析......)