带你了解SQL注入(详细)
本篇文章给大家带来了sql注入的相关知识,SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为,希望对大家有帮助。
SQL是什么?
结构化查询语⾔(Structured Query Language ,SQL),是⼀种特殊的编程语⾔,⽤于数据库的标准数据查询。1986 年10 ⽉美国国家标准协会对SQL 进⾏了规范后,以此作为关系型数据库系统的标准语⾔。1987 年得到了国际标准组织的⽀持,成为了国际标准。
什么是SQL注入
SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为
漏洞原理
SQL 注⼊的攻击⾏为可以描述为通过⽤户可控参数中注⼊SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击⾏为。其成因可以归结为以下两个原因叠加造成的。
- 程序员在处理程序和数据库交互时,使⽤字符串拼接的⽅式构造SQL 语句
- 未对⽤户可控参数进⾏⾜够的过滤,便将参数内容拼接到SQL 语句中
漏洞原因
- 用户能够控制输入
- 是对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行
为什么会有SQL注入
- 代码对带入SQL语句的参数过滤不严格
- 未启用框架的安全配置,例如:PHP的magic_quotes_gpc
- 未使用框架安全的查询方法
- 测试接口没有删除
- 未启用防火墙
- 未使用其他的安全防护设备
注⼊点可能存在的位置
根据SQL 注⼊漏洞的原理,⽤户"可控参数"中注⼊SQL 与发,也就是说Web 应⽤获取⽤户输⼊的地⽅,只要带⼊数据库查询,都有存在SQL 注⼊的可能,这些地⽅通常包括:
- GET 数据
- POST 数据
- Cookie 数据
- HTTP 头部(HTTP 头部中的其他字段)
漏洞危害
- 数据库信息泄漏、获取、修改敏感数据:数据库中存放的用户的隐私信息(帐号、密码)的泄露
- 绕过登录验证:使用万能密码登录网站后台等
- 文件系统操作:列目录,读取、写入文件等
- 网页篡改:通过操作数据库对特定网页进行篡改,嵌入网马链接,进行挂马攻击
- 注册表操作:读取、写入、删除注册表等
- 执行系统命令:远程执行命令
- 服务器被远程控制、种植木马:黑客可以修改或控制操作系统
提交方法
提交方法有:get、post、cookie、request等
其中:request支持度较好,你把参数以get方式、post方式、cookie方式提交都是可以的
判断注入点
会在疑似注⼊点的地⽅或者参数后⾯尝试提交数据,从而进⾏判断是否存在SQL 注⼊漏洞。
测试数据 | 测试判断 | 攻击思路 |
---|---|---|
-1或+1 | 是否能够回显上⼀个或者下⼀个页面(判断是否有回显) | 联合注入 |
' 或" | 是否显示数据库错误信息;回显的页面是否不同(字符型还是数字型) | 报错注入 |
and 1=1 或者 and 1=2 | 回显的页面是否不同(判断页面是否有布尔类型的状态) | 布尔盲注 |
and sleep(5) | 判断页面的返回时间 | 延时注入 |
判断转义 | ||
注意:如果你对着一个网站测试的时候,出现404,或者页面跳转,说明网站有防护
判断字符型还是数字型
如下图,一般来说,id之类的参数后面跟的是数字型(也有可能是字符型),别的参数后面跟的是字符型
sql注入绕过
- 大小写绕过
- 双写关键字绕过
- 特殊编码绕过
如果有些字符串确实被限制的很严格,我们可以尝试一些编码绕过。
如URLEncode编码,ASCII、HEX、unicode编码绕过:
- or 1=1即%6f%72%20%31%3d%31,
- Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
- 空格过滤绕过
- 过滤函数绕过
- sleep() ——> benchmark()
- substr()、substring()、mid()可以相互替换
- user() ——> @@user() 、datadir ——> @@datadir
- ord() ——> ascii() :这两个函数在处理英文时效果一样,但处理中文时效果不一样
- ascii ——> hex()、bin():替代之后再使用对应的进制转string即可
- group_concat() ——> concat_ws()
- 内联注释绕过
/*!...*/
在MySQL里,/**/是多行注释,这个是SQL的标准,但是MySQL扩张了解释的功能,如果在开头的的/*后头加了感叹号/*!50001sleep(3)*/
,那么此注释里的语句将被执行。
/*!50001 select * from test */;
这里的50001表示假如 数据库是5.00.01以上版本,该语句才会被执行,对于有些waf我们可以通过这种方式进行绕过。
获取网站路径
路径常见获取方法:
- 报错显示
- 遗留文件
别用百度,用谷歌搜索inurl:phpinfo.php
漏洞报错、平台配置文件、爆破等
SQL 注入读写文件
可以利用SQL 注入漏洞进行文件读写。
利用的前提条件:
1. 数据库支持文件读写
这里涉及到1个变量secure_file_priv
,该参数在高版本的 mysql 数据库中限制了文件的导入导出操作。若要配置此参数,需要修改 my.ini 配置文件,并重启 mysql 服务【其在Phpstudy中默认是NULL,不允许读写文件】
参数 | 含义 |
---|---|
secure_file_priv=NULL | 限制mysqld 不允许导入导出操作 |
secure_file_priv=‘c:/a/’ | 会限制mysqld 的导入导出操作在某个固定目录下,并且子目录有效 |
secure_file_priv= | 不对mysqld 的导入导出操作做限制 |
修改配置文件,对读写不做限制,文件路径C:phpStudyMySQLmy.ini
,该操作比较敏感,需要在mysql的配置文件中操作,在phpmyadmin网页中不能修改
2. 当前用户具有文件权限
- 获知当前用户和主机名
?id=-1'union select 1,current_user(),3 --+
发表评论