sql 命令未正确结束_渗透测试之SQL注入(1)
渗 透 测 试
之 SQL 注 入(1)
前言
不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一。
01
基本介绍
结构化查询语言(StructuredQueryLanguage,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSIX3.135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。SQL注入(SQLInjection)是一种常见的web安全漏洞,攻击者利用这个问题,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。
02
产生原因
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
03
类型分类
SQL注入类型大致可以分为三类:
1. 从注入手法分类可以分为:联合查询注入、报错型注入、布尔型注入、延时注入、堆叠注入;
2. 从数据类型上可以分为:字符型(即输入的输入使用符号进行过滤)、数值型(即输入的输入未使用符号进行过滤);
3. 从注入位置可以分类为:GET数据(提交数据方式为GET,大多存在地址栏)、POST数据(提交数据方式为POST,大多存在输入框中)、HTTP头部(提交数据方式为HTTP头部)、cookie数据(提交数据方式为cookie)。
04
产生危害
SQL注入漏洞常见且危害性大,具体表现为:
绕过登录验证
使用万能密码登录网站后台等
获取敏感数据
获取网站管理员帐号、密码等
文件系统操作
列目录,读取、写入文件等
注册表操作
读取、写入、删除注册表等
执行系统命令
远程执行命令
05
举例
下面我们拿sqli-labs闯关游戏来举例。
1.联合查询注入
其中最重要的是页面要有显示位,即爆出来的库信息能在页面上当作正常数据显示出来。然后爆出来的库信息要放在select后相应的位置。下面是操作步骤:
首先判断闭合类型
?id=1' and 1=1 --
?id=1' and 1=2 --
显示不同,所以是单引号闭合其次判断显示位数3位?id=-1' order by 4 --
最后进行联合查询注入http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,database() --
2.报错型注入使用检测闭合类型的方法发现有关有报错信息,可以实现报错注入,下面是常见的注入步骤:
测试闭合类型为单引号闭合
输入报错注入的函数http://localhost/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,database(),0x7e)) --
报错函数不单单只有extractvalue,还有updatexml和floor,下面我们说明一下使用情况和方法:
extractvalue函数:extractvalue(1,2)在xml文档中提取相应的值,第一个数值表示xml字符串,第二个是xml路径。注入的时候,使用的方式大概为?id=1 and extractvalue(111,'~sdfggfds'),发现第二位的属于会在报错代码中显示。使用的限制为对mysql版本有要Mysql5.0 以上才能使用函数。
UpdateXml函数:该函数共有三个参数,第一个参数是XML文档对象的名称,第二个参数是xml路径,第三个参数是String格式替换查找到的符合条件的数据。注入的时候,使用的方式大概为id=1 and updatexml(1,concat(0x7e,(查询的内容),0x7e),1),使用的限制为对mysql版本有要Mysql5.0 以上才能使用函数。
Floor函数:注入的时候,使用的方式大概为?id=1 and (select 1 from (select count(*),concat((select 查询的内容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) -- ,且适应任何mysql版本。
3.布尔型注入
测试闭合类型为双括号单引号闭合,并且回显对错,而不显示SQL语法错误内容
判断显示位数为3
判断数据库名字长度为8位?id=1')) and length(database())=8--
使用asc码进行测试数据库?id=1')) and ascii(substr(database(),1,1))>90 --
得出首字母在90-122之间 得出首字母是115 对应s
4.延时注入
使用sleep函数进行延时查询闭合方式,sleep()函数可以让页面延迟运行一段时间。输入?id=1' and sleep(10) --+发现页面会有延时,则说明闭合方式为单引号闭合,使用if函数判断数据库长度范围,数据库函数if(表达式,1,2)如果表达式成立输出1,不成立输出2,输入?id=1' and if(length(database())=8,sleep(10),0) -- 进行测试。最后使用ASCII码进行获取首字母,?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),0) -- ,执行时发现有延时则说明测试的ASCII对应刚好就是115。
5.堆叠注入在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
06
防御方法
防止注入漏洞需要将数据与命令语句、查询语句分隔开来。
• 最佳选择是使用安全的API,完全避免使用解释器,或提供参数化界面的接口,或迁移到ORM或实体框架。
注意:当参数化时,存储过程仍然可以引入SQL注入,如果PL/SQL或T-SQL将查询和数据连接在一起,或者执行带有立即执行或exec()的恶意数据。
• 使用正确的或“白名单”的具有恰当规范化的输入验证方法同样会有助于防止注入攻击,但这不是一个完整的防御,因为许多应用程序在输入中需要特殊字符,例如文本区域或移动应用程序的API。
• 对于任何剩余的动态查询,可以使用该解释器的特定转义语法转义特殊字符。
注意:SQL结构,比如:表名、列名等无法转义,因此用户提供的结构名是非常危险的。这是编写软件中的一个常见问题。
• 在查询中使用LIMIT和其他SQL控件,以防止在SQL注入时大量地泄露记录。
关于我们:
北京冠程科技有限公司(Beijing GctechTechnologyCo.,Ltd.)是一家集人才、技术和经验于一体的,提供全面网络安全解决方案的专业服务商。冠程科技致力于为各行业的网络安全需求提供软件研发和通用解决方案,业务领域主要包括基础服务、咨询业务、产品研发和安全培训四大版块,各版块相互独立又相辅相成,完美阐释了“专业服务、全程服务、延伸服务”的服务体系和“单一业务与长远目标相融合”的服务理念。
关注冠程科技,关注网络安全!
总公司:北京冠程科技有限公司
地址:北京市昌平区科技园区东区产业基地企业墅上区一号楼九单元四层
河北分公司:河北镌远网络科技有限公司(隶属于冠程科技的河北分公司)
地址:河北省邯郸市丛台区中华北大街193号慧谷大厦14层1418号
实训基地:河北省石家庄市电子信息学校冠程科技研究与实训中心
欢迎扫描关注我们,及时了解更多关于网络安全相关知识
sql 命令未正确结束_渗透测试之SQL注入(1)相关推荐
- mysql中00933错误_java.sql.SQLException: ORA-00933: SQL 命令未正确结束错误解决
在程序运行时,程序报sql错误"nested exception is java.sql.SQLException: ORA-00933: SQL 命令未正确结束",具体错误如下所 ...
- SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决
QUESTION:SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决? ANWSER: 一:问题提出: 使用S ...
- ORA-00933:SQL 命令未正确结束(1)
项目中mysql数据库换oracle数据库中报ORA-00933:SQL 命令未正确结束 问题 1.报错:ORA-00933:SQL 命令未正确结束 2.解决方法:将图1中的limit分页改成图2中的 ...
- ORA-00933: SQL 命令未正确结束处理办法
问题现象:删除数据库表,oracle中出现bin$XXXXXXXXXX==$0表 ,在对其 (bin$XXXXXXXXXX==$0)删除时,报 ORA-00933: SQL 命令未正确结束 出现 ...
- ORA-00933: SQL命令未正确结束 解决办法
1.报错内容 Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 ; bad SQL grammar []; nested ...
- ORA-00933: SQL 命令未正确结束,原因竟是因为这样...
public int updatePersonalInfo(Employee emp) {String sql = "update employee set"+ " re ...
- Mybatis 批量插入报ORA-00933: SQL 命令未正确结束
Mybatis 批量插入报ORA-00933: SQL 命令未正确结束 错误出现的场景是这样的,将多个月份的1000条数据分别插入到各月份表中. MySQL中,批量插入数据到表,会在一定程度提高效率. ...
- ORA-00933: SQL 命令未正确结束
org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.SQLSy ...
- 解决 java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 问题
1.案例 SQL 命令未正确结束. 2.解决 设断点,调试SQL 语句, 修改前代码: String sqlK="select MRL_CODE as MRLCODE,MRL_NAME as ...
最新文章
- RabbitMQ声明队列参数作用详解
- 三十三、Scrapy中的强大媒体管道ImagesPipeline
- VTK:几何对象之OpenVROrientedCylinder
- Kettle使用_3变量替换之获取系统信息与命名参数
- CSS3选择器(二)--表单
- php不用于输出的函数,PHP常用函数和常见疑难问题解答
- VI.Multidocument Transactions
- 关于驰骋工作流程引擎节点访问规则的变更发布
- codeforces 题解
- PLC:学习笔记(西门子)2
- apache 二级域名设置完整步骤
- 亲爱的波特兰——CJ麦科勒姆告别信
- Vue进阶(四十四):vue 图片加载完成事件
- 为响应国家号召1+X证书Web前端开发最新考试模拟题
- 西瓜书——支持向量机
- 【EE】案例分享-如何设计继电器电路?
- 准备进入ReRAM速度!Crossbar发布SMIC芯片样品
- 最新!抖音运营吸粉攻略分享
- superMap Cesium(超图) ---scene open()用法
- 威联通架设php网站_初次体验架设PHP网站
热门文章
- kind富文本编辑器_在项目中集成富文本编辑器
- 服务器jbod扩展_三分钟了解服务器关键技术——RAID
- xgboost通俗_【通俗易懂】XGBoost从入门到实战,非常详细
- SSL自签名的实现类org apache commons httpclient contrib ssl EasySSLP
- Python学习笔记:目录与文件操作
- 【BZOJ1912】【codevs1613】巡逻
- android+proguard目录,Android proguard问题:路径可能不是null或空字符串.路径=“空”...
- vue 文件及描述信息一起上传_vue+element 实现选取文件,提交上传全部表单信息(同步)...
- 2017.3.30 时态同步 失败总结
- 2017.3.13 反素数ant 失败总结