目录
简介:
SQL注入漏洞是一种常见的漏洞。利用SQL注入漏洞去查询记录,会造成数据泄露,如果泄露的数据中含有管理员密码,还可能导致拖库发生。
功能特点:
SQL注入漏洞往往是因为对用户输入过滤不严。SQL注入漏洞多是高危漏洞,会导致严重的后果。验证漏洞时,为了提高效率,经常会先尝试使用sqlmap自动化工具辅助判断,但手工注入比自动化工具可以发现更多的注入点。
各防护等级简介:
low等级,对SQL注入行为毫无设防;
medium等级,对SQL注入行为防护不足,防护做法欠考虑;
hight等级,对SQL注入行为有一定防护,但有疏忽;
impossible等级,对SQL注入行为正确防护。
基础知识补充:
整型注入与字符型区别:
当输入的内容为数字时,可能存在整型注入,也可能存在字符型注入。区别在于,整型不需要单引号来闭合,而字符型需要通过单引号来闭合的。可以简单的理解为,不需要考虑单引号如何闭合则为整型注入,其他情况均是字符型。
information_schema:信息数据库,保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表名,表列的数据类型与访问权限等。
mysql_real_escape_string():实现转义7种危险字符。SQL 语句字符串中的特殊字符,如输入单引号’则处理时会在其前面加上右斜杠\来进行转义,如果语句错误则输出相应的错误信息。其中受影响的字符如下:\x00 \n \r \ ' " \x1a
记住下面几个词的含义及用法。
几个常出现的单词:
1.information_schema.tables:存储着MySql中的所有表;
2.information_schema.columns:存储着MySql中的所有列;
3.table_schema是数据库的名称;
4.table_name是具体的表名;
5.table_type指的是表的类型;
6.group_concat(0x3e,xxx):连接多个字段成一个字段;
7.union操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
Low
源码:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
break;
case SQLITE:
global $sqlite_db_connection;
#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);
#$sqlite_db_connection->enableExceptions(tru