SQL注入介绍 摘要本文介绍了SQL注入的概念、产生原因、危害详细描述了其在渗透中的利用方式包括绕过验证、获取敏感数据等并探讨了如何挖掘SQL注入漏洞和判断其存在的方法。目录一、什么是注入二、什么是SQL注入三、SQL注入漏洞是怎么形成的四、SQL注入的危害五、SQL注入在渗透中的利用1、绕过登录验证2、获取敏感数据3、文件系统操作4、注册表操作5、执行系统命令六、如何挖掘SQL注入1、常见的SQL注入漏洞流程2、SQL注入漏洞分类3、可能存在SQL注入的地方4、如何判断是否存在SQL注入5、SQL注入测试思路七、SQL注入常用函数1、报错函数2、截取函数3、判断函数4、总结先到这里吧下见一、什么是注入将不受信任的数据作为命令或查询的一部分发送到解析器时会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。注入能导致数据丢失、破坏或泄露给无授权方缺乏可审计性或是拒绝服务。注入有时甚至能导致主机被完全接管。注入攻击的本质就是把用户输入的数据当做代码执行。过于信任用户二、什么是SQL注入所谓SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串最终达到欺骗服务器执行恶意SQL命令目的的入侵行为。SQL注入实质就是闭合前一句查询语句构造恶意语句恶意语句被代入SQL语句执行。三、SQL注入漏洞是怎么形成的随着B/S浏览器与服务端模式被广泛的应用用这种模式编写应用程序的程序员也越来越多但由于开发人员的水平和经验参差不齐相当一部分的开发人员在编写代码的时候没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断导致了攻击者可以提交一段数据库查询代码根据程序返回的结果获得一些他想得到的数据。这样就产生了被称为数据库的注入攻击SQL注入攻击。原因1数据与代码未严格分离原因2用户提交的参数数据未做充分检查过滤即被代入到SQL命令中改变了原有SQL命令的“语义”且成功被数据库执行。原因3SQL命令可以进行查询、插入、删除等操作直接将这些命令拼接起来。四、SQL注入的危害这些危害包括但不局限于数据库信息泄漏数据库中存放的用户的隐私信息的泄露。网页篡改通过操作数据库对特定网页进行篡改。网站被挂马传播恶意软件修改数据库一些字段的值嵌入网马链接进行挂马攻击。数据库被恶意操作数据库服务器被攻击数据库的系统管理员帐户被窜改。服务器被远程控制被安装后门经由数据库服务器提供的操作系统支持让黑客得以修改或控制操作系统。破坏硬盘数据瘫痪全系统。一些类型的数据库系统能够让SQL指令操作文件系统这使得SQL注入的危害被进一步放大。五、SQL注入在渗透中的利用1、绕过登录验证使用万能密码登录网站后台等。举例万能密码假设我的数据名是useradmin密码是password123456正常的查询语句SQLselect * from users where user’admin’ and password’123456’;使用SQL注入构造的POC是SQLselect * from users where user’admin’ or 1’1’ --’ and password’123456’;这个POC就可以直接把整个表的所有数据全部输出来无视密码。注释----是注释的意思是空格的意思浏览器 会自动把识别为空格假如直接在数据库里面直接--就可以。2、获取敏感数据获取网站管理员帐号、密码等。3、文件系统操作列目录读取、写入文件等。4、注册表操作读取、写入、删除注册表等。5、执行系统命令远程执行命令。六、如何挖掘SQL注入1、常见的SQL注入漏洞流程2、SQL注入漏洞分类按数据类型数字型(Integer)字符型(String)按返回结果显错注入(Error-Based)就是查看查询语句的返回结果是否出现报错从报错内容来推断数据库相关信息。盲注(Boolean/Time-Based Blind)就是靠猜测输入数据查询语句看返回的自己长度来判读语句是为真还是为假。3、可能存在SQL注入的地方登录框、参数名、参数值、搜索框、跟用户有交互的地方、表单的提交、Cookie asp类型的网站比较多、目录名、文件名、…最普遍的注入漏洞是由于参数值过滤不严导致的。Cookie注入漏洞普遍存在于ASP的程序中。参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。4、如何判断是否存在SQL注入根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行如果测试语句被执行了说明存在注入漏洞。5、SQL注入测试思路盲注判断是否存在注入注入是字符型还是数字型猜解当前数据库名猜解数据库中的表名猜解表中的字段名猜解数据联合查询注入判断是否存在注入注入是字符型还是数字型猜解SQL查询语句中的字段数确定显示的字段顺序获取当前数据库获取数据库中的表七、SQL注入常用函数1、报错函数extractvalue()例子字符型and(extractvalue(1,concat(0x7e,(selectuser()),0x7e)))1数字型and (extractvalue(1,concat(0x7e,(select user()),0x7e)))1updatexml()例子字符型and(updatexml(1,concat(0x7e,(selectuser()),0x7e),1))1数字型and(updatexml(1,concat(0x7e,(SELECT version),0x7e),1))1GTID_SUBSET():报错信息只会包含“触发报错的那个参数”。第一位一旦非法报错第二位的执行结果根本不会出现在错误回显里。因此要将查询poc放在第一个参数2、截取函数Leftleft( Str, index)Str–表示待截取的字符串index–表示从左边开始共截取多少位Left(database(),1)sLeft(a,b)从左侧截取a的前b位。例如数据名securityLeft(database(),1)s 为正常Left(database(),2)se为正常可以配合bp快速爆破数据库。mid此函数为截取字符串一部分。MID(column_name,start[,length])例如1%27andmid(user(),1,1)%27rsubstrSubstr(a,b,c)从b位置开始截取字符串a的c长度。Substr(user(),1,1)r3、判断函数ifif(a,b,c)当a为真时候执行 ba为假时执行 c。常用在时间盲注and if(aa,sleep(1),sleep(5)) --case whencase when 条件 then 正确的结果 else 错误的结果 end例如1and1/(casewhenuser()liker%then1else0end)14、总结先到这里吧下见SQL注入技术详解从联合查询到盲注实战-CSDN博客