在线时间0 小时
主题2
联都中级会员
- UID
- 667
- 经验
- 88 点
- 威望
- 1 点
- 在线时间
- 0 小时
- 注册时间
- 2003-9-17
|
我们不仅可以修改$Board和$Number参数,而且还可以提交额外的SQL命令。
试想一下,如果我们提交的$Board参数是下面的样子:
'general; DROP TABLE general; SELECT * FROM general '
那么在服务器端就会转化成:
SELECT B_Main,B_Last_Post FROM general; DROP TABLE general;
SELECT * FROM general WHERE B_Number=$Number
';'符号是SQL命令的结束符。通常我们可以使用'#'来使MySQL忽略此行上的其它
内容。但是,'FROM'和'WHERE'是在一个分开的行上,所以MySQL不会忽略它。考虑到
错误的SQL语句会使MySQL忽略运行后面的语句,所以我们至少要提交一个有效的命令。
在本例中,我们提交一个和原始命令相似的generic select命令,理论上的结果应该
是删除general论坛所在的表。
但是在实际上并没有成功,并不是因为理论是错误的,而是因为我们使用的数据 库用
户没有DROP权限。并且根据wwwthreads编写的方法,它不完全允许你这么做。但是一切
并没有白费,我们可以修改其它的参数,看看哪里会出问题...而且我们可以到
我喜欢使用less命令,所以我就'less showpost.pl',并且寻找(用'/')'SELECT'
字符串。发现了:
# Grab the main post number for this thread
$query = qq!
SELECT Main,Last_Post
FROM $Board
WHERE Number=$Number
!;
Wow,就是它!除了几个参数的名字(Main,Last_Post,Number)和前面的(B_Main,
B_Last_Post,B_Number)不同。如果我们看看它的上面,我们会发现:
if (!$Number) {
w3t::not_right("There was a problem looking up the Post...
这就是对$Number参数的限制。
基于这一点让我们来看看“为什么”我们要研究它。很显然我们有可能达到DROP表
这种DOS攻击,你还有可能修改其它人的发言,但那仍然不是我们要的。我们没准能建立
我们自己的论坛?所有的信息都储存在数据库里。但是有许多记录要去更新。成为一个
数据库操作员怎么样?或者更进一步,成为管理员怎么样?管理员可以增添、删除、修
改论坛、用户等。这是值得一试的,虽然你仍然将会被限制在论坛的领域里,那是一个
小的可怜的领域。
但是,这仍然有一件事情值得为它一试。如果你注册为一个用户,你会发现你必须要
输入一个密码。Hmmm...这个密码储存在某个地方,好象是数据库里。考虑到许多人的密
码用在很多地方,而且wwwthreads(在某些配置上的错误?)把发言者的IP地址发到论坛
上。如果我们能得到某个人的密码,就可能去攻破他的主机。
所以,让我们来看看密码是怎么存储的。进入到论坛的“编辑属性”页,有一个密码
域,通过HTML源码看,像是有一个可怕的加密密匙。妈的,这些密码是加密过的。这意味
着你需要一个密码破解软件和大量的时间去对密码进行解密。当然,这是假定你*能够*得
到密码...
首先我们要去获得论坛管理员权限。adduser.pl程序是我们开始的好地方,因为它可
以让我们看到一个用户的全部参数。看看下面的代码:
# --------------------------------------
# Check to see if this is the first user
$query = qq!
SELECT Username
FROM Users
!;
$sth = $dbh -> prepare ($query) or die "Query syntax error: $DBI::errstr.
Query: $query";
$sth -> execute() or die "Can't execute query: $query. Reason:
$DBI::errstr";
my $Status = "";
my $Security = $config{'user_security'};
my $rows = $sth -> rows;
$sth -> finish;
# -------------------------------------------------------
# If this is the first user, then status is Administrator
# otherwise they are just get normal user status.
if (!$rows){
$Status = "Administrator";
$Security = 100;
} else {
$Status = "User";
}
这段代码所做的就是看看是否定义了用户。如果没有定义用户,增添的第一个
用户就自动得到管理员权限(Status=Administrator)和安全级别100。在这之后,
再定义的所有用户就只能得到普通用户权限(Status=User)了。所以我们要做的
就是要找到一种方法使得我们的Status=Administrator。我们可以再看看一条用户
记录的详细情况,如下:
# ------------------------------
# Put the user into the database
my $Status_q = $dbh -> quote($Status);
$Username_q = $dbh -> quote($Username);
my $Email_q = $dbh -> quote($Email);
my $Display_q = $dbh -> quote($config{'postlist'});
my $View_q = $dbh -> quote($config{'threaded'});
my $EReplies_q = $dbh -> quote("Off");
$query = qq!
INSERT INTO Users (Username,Email,Tot
真人游戏|足球篮球|时时メ彩| 六合投メ注| 网络赚钱去SO娱メ乐メ城:顶级信用メ提现百分百即时到账SO.CC |
|