漏洞总结
SQL原理
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。由于程序没有对用户输入做正确的处理,导致执行非预期命令或访问数据。把用户输入的数据当做代码来执行,未被了“数据与代码分离”的原则。
sql注入的关键点:
1.用户能控制用户输入的内容2.把用户输入的内容当做代码放到数据库中执行3.是否回显决定了注入的难度
SQL注入的基本流程
1.判断是否存在注入并判断是字符型注入还是数字型 2.判断查询列数,显示位置 3.获取数据库信息 4.破解加密数据 5.提升权限 6.内网渗透
sql注入的利用
1.猜解后台的数据库2.绕过登录验证3.借助数据的存储进行提权等操作
sql绕过方法
1.大小写绕过
2.简单编码绕过
3.注释绕过:如?id=1 uni//on sele//ct 1,2,3 #
4.双写绕过
5. HTTP参数污染(HPP):如?id=1 union select 1,2,3 from users where id=1 #
这时可以改为?id=1 union select 1&id=2,3 from users where id=1 #
次数&id=会在查询时变成逗号,具体细节取决于 WAF ;
这个例子也同理:?id=1//union/&id=/select/&id=/pwd/&id=/from/&id=/users #
6.使用逻辑运算符 or /and 绕过:
如?id=1 or 0x50=0x50
?id=1 and ascii(lower(mid((select pwd from users limit 1,1),1,1)))=74,其中select pwd from users limit 1,1是从 users 表里查询 pwd 字段的第一条记录, 然后 mid()就是取该记录的第一个字符, lower()把字符转换为小写, ascii 把 该字符转换成 ascii 码,最后判断等不等于 74。
-
比较操作符替换:比较操作符如!=、<>、<、>都可以用来替换=来绕过。
-
同功能函数替换:
substring()可以用mid()、substr()这些函数来替换,都是用来取字符串的某一位字符的;
ascii()编码可以用 hex()、bin(),即十六进制和二进制编码替换;
在使用在基于延时的盲注中benchmark()和sleep()可以相互替换;
group_concat 、 concat 、concat_ws 三者可以互相替换;
还有一种新的方法 ,3条语句分别如下
substring((select ‘password’),1,1) = 0x70
substr((select ‘password’),1,1) = 0x70
mid((select ‘password’),1,1) = 0x70
都是从 password 里判断第一个字符的值,可以用
strcmp(left(‘password’,1), 0x69) = 1
strcmp(left(‘password’,1), 0x70) = 0
strcmp(left(‘password’,1), 0x71) = -1
替换,left 用来取字符串左起 1 位的值,strcmp 用来比较两个值,如果比较结果相等就为 0,左边小的话就为-1,否则为 1。
-
盲注无需or和and:
例句:index.PHP
当and和or被过滤时,可以将 1修改为是通过语句生成的, index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123,123 的时候页面是正确的,现在再盲猜 hash 的第一位,如果第一位等于 0x42 也就是 B,那么strcmp结果为0,0+123=123,所以页面应该是正确的。否则就说明不是 B,就这样猜,不用 and 和 or 了。
10.加括号
11.缓冲区溢出
SQL防御方法
关键是对所有用户的输入进行严格的检查过滤、对数据库
常用的修复方案:
(1)所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。
(2)过滤危险的 SQL 语句关键字。
(3)确认每种数据的类型。
(4)数据长度应该严格规定。
(5)网站每个数据层的编码统一。
(6)严格限制网站用户的数据库的操作权限。
(7)避免网站显示 SQL 错误信息。
(8)在网站发布之前建议使用一些专业的 SQL 注入检测工具进行检测。
(9)升级 web 服务器运行平台软件补丁,建议使用 WAF 防护。
其实最有效的防御手段是下面两种:
1、预编译:
原理是采用PreparedStatement将相应的SQL语句预先编译好,即SQL引擎会预先进行语法分析,产生语法树,生成执行计划,从而无论用户输入什么内容即使是sql命令都不会影响该SQL语句的语法结构而只能当成是字符串字面值参数。但并不是所有场景都能采用SQL预编译的,如需要进行一些字符串拼接的方式,这时便需要严格检查参数的数据类型以及采用一些安全函数来处理。
其过程如下:
(1)定义预编译的sql语句,其中待填入的参数用?占位。
(2)创建预编译Statement,并把sql语句传入。此时sql语句已与此preparedStatement绑定。所以第4步执行语句时无需再把sql语句作为参数传入execute()。
(3)填入具体参数。通过setXX(问号下标,数值)来为sql语句填入具体数据。问号下标从1开始,setXX与数值类型有关,字符串就是setString(index,str)。
(4)执行预处理对象。
例子:
String sql=”select id,no from user where id=?”;
PreparedStatement ps = conn.prepareStatement(sql);
prestmt.setInt(1,id);
prestmt.executeQuery();
2、变量绑定:
文件上传原理
网页没有对用户上传的文件进行仔细的筛选,让用户成功上传了可执行的一句话木马或者其他的恶意脚本程序,从而导致自己后台服务器被攻击者利用。主要就是没有对用户上传的文件做校验,没有对上传的文件做权限设置。
文件上传利用
绕过其过滤方法,一般是上传一句话,用菜刀或者蚁剑连接进行后续的攻击。一般漏洞出现在修改头像或者留言板之类的地方。
文件上传绕过
前段检验:修改页面js代码或者使用burp改包可以绕过
后端检验:先上传jpg后缀抓包改包上传 双写php后缀上传
常见的MIMETYPE类型如下:
-
text/plain,纯文本
-
text/html,HTML文档
-
text/javascript,JS代码
-
application/x-www-urlencoded,POST方法提交的表单
-
application/msword,MicrosoftWord文件
-
application/变成语言,该种编程语言的代码
-
application/pdf,PDF文档
-
application/octet-stream,二进制数据
-
application/xhtml+xml,XHTML文档
-
image/gif+jpeg+png,各种类型的图片
-
vedio/mpeg,动画
-
multipart/form-data,POST提交时伴随文件上传的表单
文件上传防御
对上传文件进行重命名——随机重命名后攻击者无法找到文件就不能执行
隐藏文件上传路径——不知道路径自然就没有办法执行文件
后端白名单校验——只允许上传白名单里面的后缀名文件,可以有效防御文件上传
XSS原理
xss表示Cross Site Scripting(跨站脚本攻击)。插入的恶意代码被浏览器执行。
XSS利用
获取管理员权限、获取内网ip、写配置文件getshell、键盘记录、截屏等
XSS绕过
大小写混合字符 <scRiPt>alert(1)</scrIPt>
双写绕过 <scr<script>ipt>alert(1)</scr<script>ipt>
实体化编码绕过
使用其他事件绕过
XSS防御
1、设置httponly 当cookie设置为httponly之后,浏览器的cookie无法通过客户端js脚本获取。避免攻击者利用XSS漏洞进行Cookie劫持攻击。 2、htmlspecialchars() 3、验证/过滤用户输入 对用户的输入进行合理验证,对特殊字符(如<、>、’、”等)以及 <script>、 javascript 等进行过滤。
禁止未授权脚本执行
CSRF
CSRF原理
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
CSRF利用
CSRF绕过
CSRF防御
验证 HTTP Referer 字段;
在请求地址中添加 token 并验证;
本文作者:KEEP12
本文链接:https://www.cnblogs.com/ikillyou/p/14255434.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步