如何在php中使SQLi易受攻击?

时间:2013-07-17 00:04:22

标签: php mysql

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

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

checklogin.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"); 
}

的config.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');

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分: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 comment --#忽略任何后续命令

了解这些事情的好工具是DVWA

答案 2 :(得分:0)

您是否正在使用其他服务器进行测试,而不是以后运行的代码?检查设置。 magic_quotes_gpc是打开还是你的服务器而不是另一个(如果你有PHP< 5.4.0)?