php SQL Injection with MySQL

2019-04-09 10:13:19刘景俊

  否则就会报错:

The used SELECT statements have a different number of columns

  如果不知道数据类型和字段数量,可以用1来慢慢试,因为1属于intstrvar类型,所以我们只要慢慢改变数量,一定可以猜到的。如果不能马上理解上面的理论,后面有很详细的例子。
  我们看看下面的数据结构,是一个简单的文章数据表。

CREATE TABLE `article` (
`articleid` int(11) NOT NULL auto_increment,
`title` varchar(100) NOT NULL default '',
`content` text NOT NULL,
PRIMARY KEY (`articleid`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

#
# 导出表中的数据 `article`
#

INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!');
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');

  这个表的字段类型分别是int、varchar、text,如果我们用UNION联合查询的时候,后面的查询的表的结构和这个一样。就可以用“SELECT *”,如果有任何一个不一样,那我们只能用“SELECT 1,1,1,1……”了。

  下面的文件是一个很标准、简单的显示文章的文件,很多站点都是这种页面没有过滤,所以成为最明显的注入点,下面就拿这个文件作为例子,开始我们的注入实验。

<?php
$servername = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "injection";

mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");

$sql = "SELECT * FROM article WHERE articleid='$id'";
$result = mysql_db_query($dbname,$sql);
$row = mysql_fetch_array($result);

if (!$row)
{
  echo "该记录不存在";
  echo "<p>SQL Query:$sql<p>";
  exit;
}

echo "title<br>".$row[title]."<p>n";
echo "content<br>".$row[content]."<p>n";
echo "<p>SQL Query:$sql<p>";
?>

正常情况下,我们提交这样的一个请求:

http://127.0.0.1/injection/show.php?id=1

  就会显示articleid为1的文章,但我们不需要文章,我们需要的是用户的敏感信息,就要查询user表,现在是查询刚才我们建立的user表。
  由于$id没有过滤给我们制造了这个机会,我们要把show.php文件中的SQL语句改写成类似这个样子:

相关文章 大家在看