IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用XSSaminer工具在PHP中挖掘XSS漏洞

    小残发表于 2016-06-03 14:55:21
    love 0

    当想要在服务器的开source脚本代码中发掘跨站脚本漏洞时,使用静态分析方法可以使我们的分析过程变得更加简单并且自动化,另外,网上也可以找到许多相关的工具。

    我近期发现了一种通过寻找共性pattern在PHPsource码中发掘跨站脚本漏洞的简单方法。
    该方法是使用一个名为XSSaminer的工具,该工具根据grep创建,并使用bash语言编写。

    代码如下:

    #!/bin/bash
    # 1) save it as xssaminer
    # 2) allow execution: chmod +x xssaminer
    # 3) run it & check usage: ./xssaminer
    if [ -z $1 ]
    then
    	echo -e "Usage:\n$0 FILE\n$0 -r FOLDER"
    	exit
    else
    	f=$1
    fi
    sources=(GET POST REQUEST "SERVER\['PHP" "SERVER\['PATH_" "SERVER\['REQUEST_U")
    sinks=(echo die print printf print_r var_dump)
    xssam(){
    	for i in ${sources[@]}
    	do
    		a=$(grep -in "\$_${i}" $f | grep -o "\$.*=" | sed "s/[ ]\?=//g" | sort -u)
    		for j in ${sinks[@]}
    		do
    			grep --color -in "${j}.*\$_${i}" $f
    			for k in $a
    			do
    				grep --color -in "${j}.*$k" $f
    			done
    		done
    	done
    }
    if [ $f != "-r" ]
    then
    	xssam
    else
    	for i in $(find $2 -type f -name "*.php")
    	do
    		echo "File: $i"
    		f=$i
    		xssam
    	done
    fi

    工具介绍

    它首先会检查脚本参数:

    if [ -z $1 ]
    then
       echo -e "Usage:\n$0FILE\n$0 -r FOLDER"
       exit
    else
       f=$1
    fi

    代码分析:如果第一行的参数$1为空,就显示使用$0作为脚本名的用例并终止程序;否则,就将该参数分配给主函数中使用的f变量。

    sources=(GET POST REQUEST "SERVER\['PHP""SERVER\['PATH_" "SERVER\['REQUEST_U")
    sinks=(echo die printprintfprint_rvar_dump)

    接下来是带有不完整字符串的source和sink,之所以不完整,是因为它们只用于匹配。sink使用source,如果可以相互匹配(在没有任何过滤的情况下),我们就需要考虑是否有用户输入注入到已经生成的HTML代码中。

    如果sink中使用了GET、POST或REQUEST全局变量,那么这很明显就是注入问题。但是SERVER有一些特殊的地方,假设输入以下网址(带有破坏HTML属性的注入):

    http://domain/page.php/"><svg onload=alert(1)>

    尽管上面只提到了三个SERVERsource,但是我们却可以在上述代码中找到四个SERVER,如下:

    $_SERVER[‘PHP_SELF’] – returns the current URL decoded
    http://domain/page.php/"><svg onload=alert(1)>
    $_SERVER[‘PATH_TRANSLATED’] – returns file path on the system
    /var/www/html/page.php/"><svgonload=alert(1)>
    $_SERVER[‘PATH_INFO’] – returns info between page name and querystring (?)
    /"><svgonload=alert(1)>
    $_SERVER[‘REQUEST_URI’] – returns the current URL
    http://domain/page.php/"><svg onload=alert(1)>

    最后一个,REQUEST_URI,没有将URL特殊字符解码成双引号(“)或小于号(<),但是由于浏览器使用这些已编码的字符创建请求,因此,这是一个隐患。但是它只应用在存储型XSS中,用于拦截和编辑浏览器请求(或使用其他HTTP客户端),或者在加载sink前在PHP代码的其他位置进行解码。

    xssam(){
            fori in ${sources[@]}
            do
                   a=$(grep-in "\$_${i}" $f | grep -o "\$.*=" | sed "s/[]\?=//g" | sort -u)
                   forj in ${sinks[@]}
                   do
                           grep--color -in "${j}.*\$_${i}" $f
                           fork in $a
                           do
                                   grep--color -in "${j}.*$k" $f
                           done
                   done
            done
    }

    Xssam函数用于结合source和sink,通过前两个“for”循环找到直接的隐患位置,“a”变量用于获取接收不安全的全局值(source)的变量名称。借助第三个“for”循环实现一级的脚本变量追踪。

    if [ $f != "-r" ]
    then
            xssam
    else
            for i in $(find $2 -type f -name "*.php")
            do
                   echo "File: $i"
                   f=$i
                   xssam
            done
    fi

    在主代码中,这段脚本用于选择是单个文件调用xssam函数还是进入递归模式。

    该过程通过使用命令行中提供的带有-r选项(代替文件名)的文件夹($2)来满足另一个“for”循环中相同的函数调用。

    用例:

    ./xssaminerFILE (单个文件)
    ./xssaminer-r FOLDER (递归模式, 文件夹中所有的.php文件)

    XSSaminer的主要目标是比较容易实现的XSS,而且经常会出现误报,但是它的LoC/result率是十分高的。

    测试实例

    如下截图为该工具对WordPress主题Rational Lite的测试结果:

    14648309166000

    它在2个不同的文件中找到了3个XSS漏洞,但是第二个为误报,第一个得到确认:

    14648309533416

    通过在整个模块文件中追踪存在漏洞的代码,发现当使用dismiss_id GET参数回调未认证的ajax操作时会弹出警告,一个0day漏洞出现了。

    1464831070990



沪ICP备19023445号-2号
友情链接