漏洞总结

sql原理、利用、绕过、防御

SQL注入

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。

  1. 比较操作符替换:比较操作符如!=、<>、<、>都可以用来替换=来绕过。

  1. 同功能函数替换:

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。

  1. 盲注无需or和and:

例句:index.PHP?id=1

当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、变量绑定:

是指在sql语句的条件中使用变量而不是常量,是为了减少解析的

文件上传

文件上传原理

网页没有对用户上传的文件进行仔细的筛选,让用户成功上传了可执行的一句话木马或者其他的恶意脚本程序,从而导致自己后台服务器被攻击者利用。主要就是没有对用户上传的文件做校验,没有对上传的文件做权限设置。

文件上传利用

绕过其过滤方法,一般是上传一句话,用菜刀或者蚁剑连接进行后续的攻击。一般漏洞出现在修改头像或者留言板之类的地方。

文件上传绕过

前段检验:修改页面js代码或者使用burp改包可以绕过

后端检验:先上传jpg后缀抓包改包上传 双写php后缀上传 上传图片马用文件包含 条件竞争(后面做靶场的时候把这个做一遍) 图片马,二次渲染 修改保存文件的后缀名 Upload后%00转码截断 修改上传文件大小写 特殊符号 抓包后修改Content-Type 在论坛的图片上传、头像修改可能存在文件上传 上传htaccess文件,再上传jpg 加.或者空格绕过或者加上.空格.进行绕过

常见的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原理

xss表示Cross Site Scripting(跨站脚本攻击)。插入的恶意代码被浏览器执行。

XSS利用

获取管理员权限、获取内网ip、写配置文件getshell、键盘记录、截屏等

XSS绕过

<script>alert(1)</script>判断闭合类型以及是否过滤script,<>被过滤了可以考虑使用事件,<script>标签不能使用时,还可以用<a>或<img>标签 <a href=javascript:alert()>test</a> <img src=x onerror='alert(0)'>。还可以把<script>onclickjavascript都输进去看看有没有对这些进行过滤。对字符串的过滤有两种绕过姿势,一是双写绕过,二是大小写,当大小写也不行时尝试实体化编码进行绕过

大小写混合字符 <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漏洞。

跨站请求伪造(Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF 或者XSRF,是一种挟制用户在当前已登录的Web上执行非本意的操作的攻击方法。简单来说,就是冒用你的登录信息,以你的名义发送恶意请求。

CSRF利用

CSRF绕过

CSRF防御

验证 HTTP Referer 字段;

在请求地址中添加 token 并验证;

在 HTTP 头中自定义属性并验证。

 

 

 

posted @ 2021-01-09 16:40  KEEP12  阅读(121)  评论(0编辑  收藏  举报