SQL注入总概述
没问题咱们不用表格我给你按模块拆解得更详细、更口语化一点把每个点的意思、怎么用、有啥区别都讲清楚一、SQL注入的「基础分类维度」这部分是你拿到一个网站判断“它有没有注入、怎么注入”的核心依据一共分4个维度。1. 数据库类型不同的数据库语法、注入函数、可利用的特性都不一样是你后续写注入语句的前提。MySQL最常见的开源数据库也是入门学习的重点。它自带information_schema这个系统库里面存了所有表名、字段名是联合查询注入的关键同时支持sleep()、benchmark()这类延时函数方便做盲注。大部分中小网站用的都是它。MSSQLSQL Server微软的数据库多见于Windows平台的企业系统。它的特点是权限高的时候能调用xp_cmdshell直接执行系统命令注入的破坏力会更大但语法和MySQL有不少差异比如注释符、系统表都不一样。Oracle大型企业级数据库权限控制非常严格注入场景相对复杂。一般很少能直接拿到系统命令大多是通过错误回显、存储过程或者utl_http这类扩展包来利用门槛比MySQL高很多。Access轻量级的桌面数据库多见于老的ASP网站。它没有独立的数据库服务也没有information_schema注入的时候大多靠猜解表名而且不支持联合查询方法比较受限。其他比如PostgreSQL、MongoDB这类MongoDB属于NoSQL注入逻辑和SQL完全不一样属于单独的分支。2. 提交方式注入点在哪里指的是你把恶意SQL语句提交给服务器的渠道决定了你要改哪里的参数。GET提交最常见的方式参数直接拼在URL里比如?id1、?nameadmin。你直接在浏览器地址栏修改参数就能测试比如改成?id1 and 12看页面会不会报错。POST提交参数放在HTTP请求体里一般是表单提交、接口传参的时候用比如登录框、注册页、搜索框。这种你没法直接在地址栏改得用抓包工具比如Burp Suite把请求抓下来修改里面的参数再发出去。COOKIE提交参数放在请求的Cookie字段里比如很多网站会用Cookie存用户ID、会话信息。这种方式常用来绕过一些简单的参数过滤因为很多WAF对Cookie的检测会比URL参数松一点。REQUEST提交这个不是一个独立的提交方式而是PHP里的一个超全局变量它会同时接收GET、POST、Cookie传过来的参数。也就是说你不管用GET还是POST提交它都能接收到这种情况你得实际测试一下看哪种方式能生效。HTTP头提交注入点藏在HTTP请求头里比如User-Agent浏览器标识、Referer来源页面、X-Forwarded-For这些字段。这种情况多见于后端会把请求头的信息存到数据库里或者用请求头做日志记录恶意的请求头就会被当成SQL语句执行。其他比如文件上传时的文件名、JSON请求体里的参数、WebSocket的消息内容这些都可能成为注入点属于比较特殊的场景。3. 数据类型怎么构造闭合语句指的是你提交的参数在后端SQL语句里是什么类型决定了你写注入语句时要不要加引号、怎么闭合。数字型参数直接作为数字参与SQL运算后端的SQL语句大概是select * from users where id 1参数没有被引号包裹。这种情况你直接拼接SQL语句就行比如?id1 and 12不需要额外处理引号。字符型参数被单引号或者双引号包裹比如后端语句是select * from users where name admin。这时候你直接加and 12是没用的因为它会被当成字符串的一部分。你得先把引号闭合比如改成?nameadmin and 12 --这里的把前面的字符串闭合了--是注释符把后面的单引号注释掉这样and 12就能被当成SQL语句执行了。其他类型比如日期型参数后端语句可能是select * from logs where date 2025-01-01这种也属于字符型的一种需要用引号闭合还有布尔型参数比如?status1本质上也是数字型判断逻辑和数字型一样。4. 查询方式注入依托的SQL语句指的是你的恶意语句是拼接到哪一类SQL操作里执行的不同的操作能做的事不一样。select查询最常见的场景比如查询用户信息、商品信息、文章列表。这是联合查询注入、盲注的主战场目标就是偷取数据库里的数据比如管理员账号密码。insert插入比如注册、留言、评论这类操作后端会执行insert into users (name, pass) values (admin, 123)。你如果在用户名的位置注入比如填admin, (select pass from users where id1) --就可能把管理员的密码写到你的用户名里或者直接插入一条管理员账号。delete删除比如删除留言、订单后端语句是delete from messages where id 1。注入的话比如?id1 or 11就会把表里所有数据都删掉破坏力很大。update更新比如修改密码、修改个人信息后端语句是update users set pass123 where id1。注入的话比如修改成update users set pass123 where id1 or 11就会把所有用户的密码都改成你设置的值。order by排序很多网站会用order by id或者order by name来排序数据参数可控的话就会产生注入。最常见的用法是判断查询的字段数比如order by 1正常order by 5报错说明这个查询有4个字段这是联合查询注入的前提条件。5. 回显/盲注注入的核心分支这是SQL注入最关键的分类直接决定了你用什么方法攻击。回显注入就是你执行SQL语句后结果会直接显示在页面上。比如你用union select拼接了查询管理员账号的语句页面上就会直接显示出账号和密码。这种攻击效率最高不用猜直接拿数据。无回显注入盲注页面不会直接显示SQL执行的结果你只能通过页面的变化来间接判断语句执行的结果分两种布尔盲注页面只有“正常”和“异常”两种状态比如and 11页面正常and 12页面异常你就可以通过构造条件比如and ascii(substr(database(),1,1))115逐位猜解数据库名的每一个字符。延时盲注利用sleep()这类延时函数比如and sleep(5)如果页面响应时间明显变长说明语句执行成功了。你可以通过控制延时的时间来判断条件的真假比如猜解字符的时候猜对了就延时5秒猜错了就正常返回。二、WAF绕过技术WAFWeb应用防火墙会识别并拦截常见的注入语句绕过的核心思路就是“改变语句的形式但不改变它的逻辑”常见的方法有这些更改提交方法比如原来的GET请求被拦截了改成POST提交或者把参数拆分到多个位置比如把id1改成id1放到URL里and 12放到Cookie里让WAF没法完整匹配。大小写混合WAF很多时候只会匹配小写的关键词比如select你改成sElEcT、UNion就能绕过一些简单的规则。加解密编码类比如URL编码把空格改成%20把单引号改成%27或者用Unicode编码、HTML实体编码把关键词转换成WAF识别不出来的形式到了后端数据库还是会被还原成正常的SQL语句。注释符混用用/*...*/注释符把关键词拆开比如sel/*abc*/ect或者用--、#、%23这些不同的注释符绕过对--的拦截。等价函数替换比如把sleep()换成benchmark(1000000,sha1(test))把and换成把or换成||功能一样但WAF匹配不到原来的关键词。特殊符号混用用制表符%09、换行符%0A、回车符%0D代替空格比如select%0A*%0Afrom%0Ausers很多WAF会把空格当成关键词分隔符换成其他空白符就匹配不到了。三、其他特殊注入方式这些是常规注入之外针对特殊场景的注入方法加解密注入前端提交的参数是加密过的比如密码用了MD5加密或者参数用了AES加密后端会解密之后再拼接到SQL语句里。这种情况你得先破解前端的加密逻辑或者找到加密算法的漏洞构造出能解密后变成恶意SQL语句的参数。JSON注入注入点在JSON格式的请求体里比如{username:admin,password:123}后端直接把JSON里的字段拼接到SQL里。这种情况你要构造符合JSON格式的恶意语句比如{username:admin or 11 --,password:123}还要注意JSON的转义规则比如引号、斜杠这些特殊字符。LDAP注入针对LDAP目录服务的注入逻辑和SQL注入类似都是构造恶意的查询条件但语法不一样用的是*、()这些特殊符号来绕过过滤或者执行恶意查询常见于企业内部的用户认证系统。二次注入恶意的SQL语句第一次提交的时候后端做了过滤被当成普通数据存到了数据库里但后续的业务逻辑里后端会直接把数据库里的这个数据拼接到SQL语句里执行这时候恶意语句就被触发了。比如你注册了一个用户名是admin --第一次注册的时候被过滤了但后台修改用户权限的时候直接把用户名拼进SQL就会把管理员的权限改掉。堆叠注入利用数据库支持多语句执行的特性用分号;分隔多条SQL语句比如?id1; drop table users;后端执行完select * from users where id1之后会继续执行后面的drop table users直接把表删掉。MySQL在开启多语句执行的时候支持这个威力很大。四、SQL注入防御方案最后是怎么防注入分开发和防护两个层面代码层面的过滤与规范输入验证对参数做严格的校验比如ID必须是数字用户名只能包含字母和数字长度不能超过限制直接把不符合规则的请求拦截掉。参数化查询预编译语句这是最根本的防御方法用PreparedStatement这类预编译接口让SQL语句和参数完全分离参数不会被当成SQL语句执行从根源杜绝注入。最小权限原则给数据库账号分配的权限越小越好比如只给查询的权限不给删除、修改、创建表的权限就算被注入了也没法做太过分的事。错误信息脱敏后端不要直接把数据库的报错信息返回给前端比如You have an error in your SQL syntax这种信息会泄露数据库的结构给攻击者提供线索。WAF产品部署 在网站前面部署Web应用防火墙配置规则拦截常见的注入语句、异常请求比如拦截包含union select、sleep、drop这些关键词的请求限制请求的频率防止暴力猜解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544209.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!