1

我的任务是制作一个易受攻击的 php 应用程序,这是我的登录页面代码。问题是我不能让它变得脆弱。当我尝试使用登录字段进行 SQL 注入时,没有任何反应。

如何使其容易受到 SQLi 攻击or '1'='1'或类似攻击?

检查登录.php

require "config.php";
$tbl_name="members"; 

mysql_connect("$servername", "$dbusername", "$dbpassword")or die("Spajanje bezuspješno");
mysql_select_db("$dbname")or die("Selektrianje baze bezuspješno");

$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";

$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count==1){
  $_SESSION['myusername'] = $myusername;
  $_SESSION['mypassword'] = $mypassword;
  header("location:addnews.php");
}
else {
  header("location:login_failed.php"); 
}

配置文件

$servername='localhost';    
$dbusername='root';                
$dbpassword='qwe123';               
$dbname='ferida';     

connecttodb($servername,$dbname,$dbusername,$dbpassword);
function connecttodb($servername,$dbname,$dbusername,$dbpassword)
{
  global $link;
  $link=mysql_connect ("$servername","$dbusername","$dbpassword");
  if(!$link){die("Ne mogu se spojiti na MySQL");}
  mysql_select_db("$dbname",$link) or die ("Ne mogu otvoriti bazu podataka".mysql_error());
}

数据库

CREATE TABLE IF NOT EXISTS `members` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `username` varchar(65) NOT NULL,
  `password` varchar(65) NOT NULL,
  PRIMARY KEY (`id`)
) 

ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4*/ ;

INSERT INTO `members` (`id`, `username`, `password`) VALUES
(1, 'admin', 'P@ssw0rd'),
(2, 'r00t', '1qa2ws'),
(3, 'editor', 'q1w2e3r4');
4

3 回答 3

4

它实际上很容易受到 SQL 注入的攻击。我怀疑问题可能出在您为用户名和密码输入的值上。

您需要确保 SQL 注入代码创建的 SQL 语句是有效的,并且恰好返回一行以满足$count==1检查。

一种方法是将用户名输入为admin'#. 这会关闭用户名字符串并开始注释,这会导致您输入的任何密码都被忽略。因此,您无需提供密码即可登录。

使用1=1类型注入将无法正常工作,因为它们通常会返回数据库中的所有行,从而导致$count==1检查失败。一个可行的变体是使用 . 的用户名admin和 . 的密码1' or username='admin

于 2013-07-17T02:17:22.980 回答
1

正如丹所说 - 你已经是。在用户名中输入 root 并在密码中输入'or '1'='1

这将 sql 语句从

SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'

SELECT * FROM $tbl_name WHERE username='root' and password='' or '1' = '1'

请注意,您必须填写密码周围的引号。您还可以使用 sql 注释--#忽略任何后续命令

了解这些东西的一个好工具是DVWA

于 2013-07-17T09:40:44.393 回答
0

您是否使用另一台服务器进行测试,而不是稍后运行代码?检查设置。是否magic_quotes_gpc已打开或您的服务器但未在其他服务器上(如果您的 PHP < 5.4.0)?

于 2013-07-17T19:07:40.983 回答