如何使php中的SQLi易受攻击登录


How to make SQLi vulnerable login in php?

我的任务是制作一个易受攻击的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');

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

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

一种方法是将用户名输入为admin'#。这将关闭用户名字符串并启动注释,这将导致忽略您输入的任何密码。因此,您可以在不提供密码的情况下登录。

使用1=1类型的注入不能很好地工作,因为它们通常会返回数据库中的所有行,从而使$count==1检查失败。一个可行的变体是用户名为admin,密码为1' or username='admin

正如丹所说,你已经是了。在用户名中输入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

您是否正在使用稍后运行代码的其他服务器进行测试?检查设置。magic_quotes_gpc是否已打开,或者您的服务器是否已打开(如果您有PHP<5.4.0)?