Web应用程序的体系结构包括客户端、Web服务器、应用服务器和数据库服务器。
Web应用安全威胁包括跨站脚本攻击、SQL注入攻击、跨站请求伪造、文件包含攻击、命令注入攻击、会话劫持、目录遍历攻击等。
通过手工审查Web应用程序的源代码、文档和系统规划,发现应用程序的漏洞。
使用工具自动下载Web站点的页面,分析站点的结构和漏洞。
使用Web应用程序安全评估工具,识别应用程序的漏洞。
利用Web服务器软件的漏洞,向服务器发送恶意代码,达到攻击服务器的目的。
攻击服务器拓展模块的漏洞,例如PHP的文件包含漏洞。
攻击服务器的样本文件,例如.htaccess文件、robots.txt文件等,获取服务器敏感信息。
通过攻击服务器,获取Web应用程序的源代码,进而分析和利用漏洞。
通过攻击服务器解析URL时的逻辑漏洞,获取服务器敏感信息。
攻击Web应用程序,例如跨站脚本攻击、SQL注入攻击、文件包含攻击等。
攻击Web数据,例如篡改Web页面、修改数据库中的数据等。
SQL注入是一种针对Web应用程序的攻击方式,攻击者通过将恶意的SQL代码注入到Web应用程序的输入参数中,从而达到欺骗数据库服务器执行非法操作的目的。SQL注入的本质是利用Web应用程序中未对用户输入的数据进行充分验证和过滤,导致攻击者可以通过构造恶意的输入参数来执行未授权的数据库查询、插入、修改、删除等操作。攻击者可以利用这些非法操作来获取敏感信息、破坏数据库完整性、影响Web应用程序的正常运行。
SQL注入攻击通常分为以下几个步骤:
(1)信息收集:攻击者通过对Web应用程序进行访问和测试,了解Web应用程序的结构、数据传输方式、输入参数等信息。
(2)构造注入语句:攻击者根据收集到的信息,构造针对Web应用程序的SQL注入攻击语句,通过在输入参数中插入恶意SQL代码来达到攻击目的。
(3)执行注入语句:攻击者将构造好的恶意注入语句发送给Web应用程序,由Web应用程序将其传递给数据库服务器执行,从而达到攻击目的。
(4)获取结果:攻击者获取数据库服务器返回的结果,包括敏感信息和执行状态等信息。
SQL注入攻击工具是指一些专门用于自动化SQL注入攻击的软件工具,包括常见的工具有:Sqlmap、Havij、BBSQL、SQLninja等。这些工具可以自动检测Web应用程序是否存在SQL注入漏洞,自动构造注入语句,自动执行注入攻击,并自动获取攻击结果。
防范SQL注入攻击的主要措施包括以下几点:
XSS攻击利用了Web应用程序没有对用户输入进行足够的过滤和转义,导致攻击者可以在Web应用程序的页面上注入恶意脚本代码,从而控制用户的浏览器,窃取用户敏感信息或者进行其他恶意操作。
XSS攻击类型包括反射型XSS、存储型XSS和DOM-based XSS。
反射型XSS攻击是指攻击者将恶意脚本代码注入到Web应用程序的URL参数中,当用户点击包含恶意代码的URL链接时,服务器将恶意代码反射回用户的浏览器执行,从而导致攻击。
存储型XSS攻击是指攻击者将恶意脚本代码注入到Web应用程序的数据库中,当用户浏览包含恶意代码的页面时,服务器从数据库中读取恶意代码并将其返回给用户浏览器执行。
DOM-based XSS攻击是指攻击者将恶意脚本代码注入到Web应用程序的DOM中,当用户浏览包含恶意代码的页面时,浏览器会解析恶意代码并执行,从而导致攻击。
为了防止XSS攻击,需要在Web应用程序的各个层面采取相应的安全防范措施。
在服务器端,需要对用户输入进行过滤和转义,确保用户输入的数据符合预期的格式和内容。具体来说,可以使用一些工具或框架来进行输入过滤和转义,例如编码库、过滤器等。
此外,还可以使用HTTPOnly和Secure等Cookie属性,以及Content Security Policy(CSP)等机制来防止XSS攻击。HTTPOnly属性可以防止JavaScript代码访问Cookie,从而防止攻击者窃取用户的Cookie信息。Secure属性可以确保Cookie只能通过HTTPS协议传输,从而防止在传输过程中被窃取。CSP机制可以限制Web应用程序可以加载的资源类型和来源,从而防止恶意脚本的注入。
跨站脚本最终是在客户端浏览器上执行的,因此对抗XSS攻击需要提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读,此外也可采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险。
首先需要在虚拟机上安装配置Firefox,apache,phpBB2,这三个在SEED Ubuntu镜像中已有,Apache Server只需要运行命令sudo service apache2 start。
phpBB2的源码路径在/var/www/SQLInjection/下。
首先使用指令mysql -u root -pseedubuntu登陆MySql数据库,-u指定用户名,-p指定密码。然后使用指令use Users; show tables;查看该数据库下面的表。
使用指令select * from credential;来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。如果要查询单独的某一个用户,可以通过select * from credential where Name=xxx;语句进行查询。
访问虚拟机内的URLwww.SEEDLabSQLInjection.com,在进入SEED Lab之前系统会要求你登陆。这个登陆认证由服务器上的/var/www/SQLInjection/unsafe_home.php实现,需要用户输入用户名和密码来通过认证。
由于上面我们已经知道phpBB2的源码路径在/var/www/SQLInjection/下。其中有一个存在sql注入攻击的主页unsafe_home.php,我们可以通过vim unsafe_home.php查看对应的源码。
通过分析文件代码,我们不难看到这里主要使用了 G E T [ ’ u s e r n a m e ’ ] 和 _GET[’username’]和 GET[’username’]和_GET[’Password’]两个session中的元素,并且对pwd进行了hash运算获得加密之后的参数。接下来使用 i n p u t u n a m e 和 input_uname和 inputuname和input_uname构建sql查询语句。最后,我们注意到对于Admin和其他员工所显示的页面是不同的。通过修改“nickname”里边的内容,我们可以实现SQL注入攻击。
# 原语句
"SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
FROM credential
WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";
# 攻击语句
"SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
FROM credential
WHERE name= 'Admin' ”;// and Password=’$hashed_pwd’
sql注入攻击之后,我们返回浏览器进入登录界面,使用账号Admin无密码登录,成功进入主页。也就证明了我们攻击的成功。
接下来我们需要用到一个Linux下的自带工具curl。它可以用来请求页面,由于这个网页是使用GET的方式传递数据,我们也就可以使用将参数放置在请求的方式进行sql注入攻击。具体的命令为curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin&Password=
根据返回结果可以看出,sql注入攻击成功。
这里如果是在select语句的后面追加,我们需要用到update命令,并且在select语句结束以后要用;隔开,如我们需要更新Alice的为0,如果用Alice账号登录的话,需要输入Alice’;updata credential set salary=‘0’ where Name=‘Alice’ #,但是出现的语法错误,这里应该是一个sql语句变量无法支持多sql语句,先查询再更新会出现死锁问题,所以我们只能从原sql为update的操作中进行注入,我们通过unsafe_edit_backend.php文件里找到了update命令。
这里我们可以直接从nickname后面加入sql注入,由于所用用户nickname都为空,所以我们可以输入’,Salary = ‘0’ where Name = ‘Alice’";#,这样email后面的赋值均被注释掉了,也就可以直接修改其他用户的属性值,下面用admin用户登录,修改Alice的salary为0。
保存并返回后发现修改成功。
然后我们尝试用Alice的用户修改Boby的密码为888888,这里我们可以用linux自带函数生成SHA-1密文:
操作步骤跟修改Alice相似,将密码改为888888,退出后登录,成功。
为了了解如何防御sql注入攻击,我们首先要知道sql语句的编译过程。编译sql语句主要分为四个阶段Parsing & Normalizaion Phasing、Compilation Phase、Query optimization Phase和Cache。
对于每个进行查询的sql语句,先要从cache进行查询看是否有已经编译好的程序,如果有就直接进行使用。若没有,则格式化字符串,编译语句,查询编译语句的优化执行,将编译好的内容放入cache,最后执行编译好的sql语句。
这里额外需要注意到的是,对于编译好的内容,各个标签的含义是确定的。例如我们使用’, salary=233333 where Name=‘Boby’#在上文对Nickname字段进行注入。但是在预编译好的sql语句中’, salary=233333 where Name=‘Boby’#这一个完整的字段将看作nickname标签的参数,这样就杜绝了通过构建sql语句进行的sql注入攻击。
首先我们先给出常见的通过组合构建sql语句进行的查询
$sql = "SELECT name, local, gender FROM USER_TABLE WHERE id = $id AND password =’$pwd’ ";
$result = $conn->query($sql))
接下来我们给出通过sql预编译形成的查询语句,语义和上述代码等价
$stmt = $conn->prepare("SELECT name, local, gender FROM USER_TABLE WHERE id = ? and password = ? ");
// Bind parameters to the query
$stmt->bind_param("?", $id, $pwd);
$stmt->execute();
$stmt->bind_result($bind_name, $bind_local, $bind_gender);
$stmt->fetch();
这里要访问的网址是http://www.xsslabelgg.com
# Elgg中已经注册的账户信息
User UserName Password
Admin admin seedelgg
Alice alice seedalice
Boby boby seedboby
Charlie charlie seedcharlie
Samy samy seedsamy
# 当前站点的地址和对应的后台文件地址
URL: http://www.xsslabelgg.com
Folder: /var/www/XSS/Elgg/
接下来我们需要安装HTTP Header Live插件。首先我们打开firefox附加组件。查找上述组件,安装,接下来我们可以在View->SideBar中找到它。
在接下来的实验中,我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。
使用Alice的账号密码进行登录,打开Alice的个人页面,进入Edit profile进行编辑。
在Brief description中插入我们的XSS攻击代码。
点击下方的Save就能看到XSS攻击的结果。
与上面任务操作类似,在Alice的Brief description中插入我们的XSS攻击代码。
点击下方的Save就能看到XSS攻击的结果。
首先我们要将上文获得的cookie放入一个特殊构建的请求,向攻击者服务器发送这个请求。我们在Alice的Brief description中插入下述代码。
这里的网址是我自己seed主机的ip地址。端口号为学号后四位(必须是未被占用的)。
然后我们在上文ip地址对应的机器上运行命令nc -l 2808 -v(nc就是netcat,-l命令指明监听的是TCP连接,2808是上文提到的端口号,-v用来输出更详细的信息)。之后任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息。最后得到的结果如下图,获取到的cookie也在其中。
首先我们应该通过HTTP Header Live查看加朋友的时候都干了什么?可以看到首先这是一个add friends的action,然后紧接着就是elgg_ts和 elgg_token,这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。同样,我们可以看到朋友的id和cookie,通过这些东西我们构造了JavaScript脚本。
接下来,我们首先将Boby好友删除,方便和后面形成对比查看。下面这段程序就是我们构造的JavaScript程序了,其中的sendurl中包含了加朋友所需要的东西,也就是我们上面分析的。所以,现在把这段程序放在Alice的About me中(这里注意要是edit HTML模式),因为原来的brief限制长度。这段代码首先是获取elgg_ts和elgg_token,然后构造一个URL访问,44是Alice号。
那么我们接下来用Boby账号进行登录,然后访问Alice的主页,Boby就会自动加Alice为好友。返回主页,我们看到右上角Boby成功添加Alice为好友。
和上一个问题类似,我们首先要用HTTP Header Live看看修改资料时要做那些事情。同样的,我们可以看到用户在修改自己的profile时发送的http请求的具体格式。通过这个方式构造和上面相近的JavaScript程序。
下面这段程序就是构造的JavaScript程序,主要部分在于构造content,其中的几个字段都是profile中的内容,需要修改什么直接修改就好。同时需要指定sendurl。这些内容都是从HTTP Header Live中得到的,然后ajax执行。
将上述代码同样放在Alice的about me中(这里注意要是edit HTML模式)。
接着使用Boby账号进行登录,然后访问Alice的profile,返回Boby主页,我们可以看到this had been changed by xss attack.。
编写代码如下(我们的目的就是这段代码能够复制到其他用户那里,那么我们的蠕虫目标就是完成了的,所以我们使用DOM来查看和使用HTML代码,innerHTML方法是开始和结束标签之间的HTML)。
将上面的代码放在Alice的about me中(注意是edit HTML模式)。
接下来切换到Boby去访问Alice的主页,可以看到如下的信息。
然后我们使用Admin去访问Boby的主页,同样发现Admin被Boby感染。
XSS蠕虫成功。
通过前面的介绍可以得知,XSS 攻击有两大要素:
纯前端渲染的过程:
如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。
常用的模板引擎,如 doT.js、ejs、FreeMarker 等,对于 HTML 转义通常只有一个规则,就是把 & < > " ’ / 这几个字符转义掉,确实能起到一定的 XSS 防护作用,但并不完善:
|XSS 安全漏洞 | 简单转义是否有防护作用|
|HTML 标签文字内容 | 有|
|HTML 属性值 | 有|
|CSS 内联样式 | 无|
|内联 JavaScript | 无|
|内联 JSON | 无|
|跳转链接 | 无|
所以要完善 XSS 防护措施,我们要使用更完善更细致的转义策略。
例如 Java 工程里,常用的转义库为 org.owasp.encoder
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
禁止加载外域代码,防止复杂的攻击逻辑。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
合理使用上报可以及时发现 XSS,利于尽快修复问题。
对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。
禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
防止脚本冒充用户提交危险操作。
Q1:修改主机名后会有报警信息
A1:需要修改/etc/hosts中的内容
Q2:网页报错You have an error in your SQL syntax;
A2:仔细检查SQL语句中的引号等符号是否是英文的。
这次的实验整体还是比较流畅的,但是开头时就发现了有些sql语句很不熟悉了。整理流程比较长,一些步骤重复性还是比较高的。另外就是对HTML代码不熟悉。