Sqli-labs 查看源代码 1-20

  • Less-1
    • indexphp
    • sqli-connectphp
    • db-credsinc
    • GET - 基于错误 - 单引号 - 字符型
  • Less-2
    • GET - 基于错误 - 整型
  • Less-3
    • 基于错误 - 单引号变形 - 字符型
  • Less-4
    • 基于错误 -双引号- 字符型
  • Less-5
  • Less-6
    • 双注入-双引号-字符型
  • Less-7
    • 单引号 双括号 非基于错误
  • Less-8
    • 基于布尔 - 单引号 - 盲注
  • Less-9
    • 单引号-时间-盲注
  • Less-10
    • 双引号-时间-盲注
  • Less-11
    • Post - 单引号 - 字符型
  • Less-12
    • post - 双引号 - 字符型双括号
  • Less-13
    • POST -基于错误-单引号-字符型双括号
  • Less-14
    • POST - 基于错误 - 双引号 - 字符型
  • Less-15
    • POST - 基于布尔 - 单引号 - 字符型盲注
  • Less16
    • POST - 基于时间 - 双引号括号 - 字符型盲注
  • Less-17
    • POST - UPDATA - 基于错误 - 单引号 - 字符型
  • Less-18
    • POST - 头信息 - uagent - 基于错误 - 字符型
  • Less-19
    • POST - 头信息 - referer - 基于错误 - 字符型
  • Less-20
    • POST - cookie注入


Less-1:

index.php


//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php"); //包含数据库连接文件
error_reporting(0);

// take the variables 
if(isset($_GET['id']))//从get方式中获取的id是否为空,非空继续
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.记录测试信息,生成一个txt。
$fp=fopen('result.txt','a');   //Open for writing only
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);//数据库查询
$row = mysql_fetch_array($result);//将查询到的结果放入数组中,查询得到结果的话,row非空

    if($row)
    {//查询得到结果
    echo "";
    echo 'Your Login name:'. $row['username'];

    echo 'Your Password:' .$row['password'];

    }
    else 
    {//查询不到结果
    echo '';
    print_r(mysql_error()); //mysql报错,报详细信息

    }
}
    else { echo "Please input the ID as parameter with numeric value";}
    //没从get方式中获取到id

?>
font> div>br>br>br><center>
<img src="../images/Less-1.jpg" />center>
body>
html>

sqli-connect.php



//including the Mysql connect parameters.
include("../sql-connections/db-creds.inc");//包含数据库账户信息
error_reporting(0);

//mysql connections for stacked query examples.
$con1 = mysqli_connect($host,$dbuser,$dbpass);

// Check connection
if (mysqli_connect_errno($con1))
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{
    @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");
}


?>

db-creds.inc



//give your mysql connection username n password
$dbuser ='root';//数据库用户
$dbpass ='';//数据库密码
$dbname ="security";// 数据库名
$host = 'localhost';//主机
$dbname1 = "challenges";
?>

GET - 基于错误 - 单引号 - 字符型:

  • GET:
if(isset($_GET['id']))//从get方式中获取的id是否为空,非空继续
{
$id=$_GET['id'];}

else { echo "Please input the ID as parameter with numeric value";}
    //没从get方式中获取到id
  • 基于错误:
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
        //
    }
    else 
    {
        print_r(mysql_error()); //输出错误
    echo "";  
    }
}
  • 单引号、字符型:
// connectivity 
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

Less-2:

跟Less-1的index.php不同之处:
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

整数型

GET - 基于错误 - 整型:

  • GET:
if(isset($_GET['id']))
{
$id=$_GET['id'];
else
{   
echo "Please input the ID as parameter with numeric value";
}
  • 基于错误:
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
    {//}
    else //查询不到数据或查询出错
    {
    echo '';
    print_r(mysql_error()); //返回详细的错误结果
    echo "";  
    }
  • 整型:

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";


Less-3:

基于错误 - 单引号变形 - 字符型

  • 基于错误
    同Less-1,2

  • 单引号变形 字符型:

// connectivity 
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

Less-4:

基于错误 -双引号- 字符型

  • 基于错误
    同Less-1,2,3

  • 双引号 字符型

// connectivity 
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

Less-5:

代码同Less-1,返回结果不同而已。

echo 'You are in...........';

Less-1返回的结果是:

echo 'Your Login name:'. $row['username'];
echo "
"
; echo 'Your Password:' .$row['password'];

web前端页面返回结果的不同,导致你在Less-5中就算注入成功了,注入攻击代码后,也会看起来并没有什么实际作用。但事实上,你的注入是成功的。
白盒测试后,才发现其真正的原因。


Less-6:

双注入-双引号-字符型

  • 双注入

???

  • 双引号 字符型
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

Less-7:

单引号 双括号 非基于错误

  • 单引号 双括号
    $sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";

  • 非基于错误,提示使用outfile函数

$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
    echo 'You are in.... Use outfile......';//提示使用呕吐file函数
    }
    else 
    {
    echo 'You have an error in your SQL syntax';//每次仅返回模糊的提示
    //print_r(mysql_error());  不返回详细的错误
    echo "";  
    }
}

Less-8:

基于布尔 - 单引号 - 盲注

  • 基于布尔 盲注

只返回两种结果,查询得到结果的话,返回You are in………..,反之,为空,啥错误提示都不返回,要注意两个页面间细微的变化

$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
    echo ''; 
    echo 'You are in...........';
    echo "
"
; echo "
"; } else { echo ''; //echo 'You are in...........'; //print_r(mysql_error()); //echo "You have an error in your SQL syntax"; echo "
"; echo ''; }
  • 单引号
// connectivity 
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

Less-9:

单引号-时间-盲注:

  • 单引号
// connectivity 
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
  • 时间 盲注

无论你的查询结果如何,都返回同样的界面You are in………..,所以等于没有返回有用的信息。所以这个时候,只能通过mysql的一些函数来进行判断。
例如:
sleep(n):执行将程序(进程)挂起一段时间

$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
    echo ''; 
    echo 'You are in...........';
    echo "
"
; echo "
"; } else { echo ''; echo 'You are in...........'; //print_r(mysql_error()); //echo "You have an error in your SQL syntax"; echo "
"; echo ''; } }

Less-10:

双引号-时间-盲注

  • 双引号
// connectivity 

$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
  • 时间 盲注
    同 Less-9

Less-11:

Post - 单引号 - 字符型

  • Post
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd']; 
}
  • 单引号 字符型
// connectivity 
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

Less-12:

post - 双引号 - 字符型(双括号)

  • post
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
    }
  • 双引号 字符型(双括号)
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

Less-13:

POST -基于错误-单引号-字符型(双括号)

  • POST
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
}
  • 基于错误
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {//     }
    else  //查询不到数据or出错
    {
        echo '';
        //echo "Try again looser";
        print_r(mysql_error()); //输出详细错误
    }
  • 单引号 字符型(双括号)
// connectivity 
@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";

Less-14:

POST - 基于错误 - 双引号 - 字符型

  • POST
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
}
  • 基于错误
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
    //
    }
    else  
    {
        //echo "Try again looser";
        print_r(mysql_error());//输出详细错误
    }
  • 双引号 字符型
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";

Less-15:

POST - 基于布尔 - 单引号 - 字符型(盲注)

  • POST
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
}
  • 基于布尔

查询得到数据返回图片1(TRUE),反之返回图片2

$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
       //
        echo '';
    }
    else  
    {
        //
        echo '';
    }

  • 单引号 字符型(盲注)
// connectivity 
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

Less16:

POST - 基于时间 - 双引号(括号) - 字符型(盲注)

  • POST
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
  • 基于布尔或时间(盲注)
    Web返回2个页面
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
        echo '';
    }
    else  
    {
        echo '';
    }
  • 双引号(括号) - 字符型(盲注)
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

Less-17:

POST - UPDATA - 基于错误 - 单引号 - 字符型

  • check_input()函数:
function check_input($value)
    {
    if(!empty($value))//检查值是否为空
        {
        // truncation (see comments)
        $value = substr($value,0,15);//限制了长度,从第一个字符开始,截取前15个字符
        }

        // Stripslashes if magic quotes enabled
        if (get_magic_quotes_gpc())
            {
            $value = stripslashes($value);//去掉斜线
            }

        // Quote if not a number
        if (!ctype_digit($value)) //如果值不是纯十进制数字
            {
            $value = "'" . mysql_real_escape_string($value) . "'";//对值加上引号,并且对不安全字符进行转义
            }

    else//如果为空
        {
        $value = intval($value);
        }
    return $value;
    }
  • substr()函数 :
    — Return part of a string
$rest = substr("abcdef", -1);    // returns "f"
$rest = substr("abcdef", -2);    // returns "ef"
  • get_magic_quotes_gpc()函数:

本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。

当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。

magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’”加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。

如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。

这些字符是单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)。
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。

不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

  • ctype_digit()函数:
    Check for numeric character(s)
    如果 text 字符串是一个十进制数字,就返回 TRUE ;反之就返回 FALSE 。

  • mysql_real_escape_string()
    本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。
    mysql_real_escape_string() 调用mysql库的函数 mysql_real_escape_string, 在以下字符前添加反斜杠: \x00, \n, \r, , ‘, ” 和 \x1a.

为了安全起见,在像MySQL传送查询前,必须调用这个函数(除了少数例外情况)。


  • POST

只对uname进行了过滤

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);  

$passwd=$_POST['passwd'];
}
  • 单引号 - 字符型
// connectivity 
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
  • UPDATA - 基于错误
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

    if($row)
    {
        $row1 = $row['username'];  //      
        $update="UPDATE users SET password = '$passwd' WHERE username='$row1'";//更改密码
        mysql_query($update);//进行数据更改

        if (mysql_error())  //如果有错误,爆出数据库详细错误
        {           
            print_r(mysql_error());
        }
        else
        {
            echo '';
            //echo " You password has been successfully updated " ;     
            echo "
"
; echo "
"; } echo ''; }

Less-18:

POST - 头信息 - uagent - 基于错误 - 字符型

  • POST
if(isset($_POST['uname']) && isset($_POST['passwd']))

    {
    $uname = check_input($_POST['uname']);
    $passwd = check_input($_POST['passwd']);
    }//对uname和passwd都进行数据过滤
  • 头信息 uagent
//获取用户的uagent和IP
$uagent = $_SERVER['HTTP_USER_AGENT'];
    $IP = $_SERVER['REMOTE_ADDR'];
    echo "
"
; echo 'Your IP ADDRESS is: ' .$IP; echo "
"
;
  • 基于错误
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)//登录成功
{
        //将用户的uagent,ip,uname插入到一张表中
        $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

        mysql_query($insert); //进行插入数据

        echo 'Your User Agent is: ' .$uagent;
        print_r(mysql_error());  //输出详细错误       
}

else
{
        echo '';
        print_r(mysql_error()); //输出详细错误
        echo '';
        echo "";  
        }
  • 字符型
$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";

Less-19:

POST - 头信息 - referer - 基于错误 - 字符型

  • POST
    同18,对uname和passwd都进行数据过滤

  • 头信息 - referer 基于错误

$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)//是否登录成功
{
//如果登录成功,将用户的referer,ip插入到一张表中
    $insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";

    mysql_query($insert);//进行数据插入 

    echo 'Your Referer is: ' .$uagent;

    print_r(mysql_error());         

    echo '';

}
else
{
    echo '';

    print_r(mysql_error());
    echo '';
}   
  • 字符型
$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";

Less-20:

POST - cookie注入

  • POST
    同上

  • cookie注入


//uname和passwd都做了过滤,而cookie没有,直接获取
$cookee = $_COOKIE['uname'];

$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
//存在一个跟cookie相关的sql语句操作,由于未进行任何过滤,所以存在cookie注入

connect parameters.
    include("../sql-connections/sql-connect.php");
    error_reporting(0);
if(!isset($_COOKIE['uname']))      {  //没收到用户发的cookie,可能是新用户,所以要重新发一个cookie
    //including the Mysql connect parameters.
    include("../sql-connections/sql-connect.php");

Welcome   '#FF0000'> Dhakkan </font>
>"; echo ""; //形成两个表单username和password echo '
" name="form1" method="post">'; echo '
15px; height:30px;">Username :    '; echo ' " name="uname" value=""/>
'; echo '
Password :      '; echo ' " name="passwd" value=""/>

'; echo '
9px;margin-left:90px;">" name="submit" value="Submit" />
'; echo '20
.jpg" />'; function check_input($value) { if(!empty($value)) { $value = substr($value,0,20); // truncation (see comments) } if (get_magic_quotes_gpc()) // Stripslashes if magic quotes enabled { $value = stripslashes($value); } if (!ctype_digit($value)) // Quote if not a number { $value = "'" . mysql_real_escape_string($value) . "'"; } else { $value = intval($value); } return $value; } if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; //降序输出 $result1 = mysql_query($sql); $row1 = mysql_fetch_array($result1); $cookee = $row1['username']; if($row1)//用户登录成功 { //给用户设置cookie setcookie('uname', $cookee, time()+3600); //setcookie() 函数向客户端发送一个 HTTP cookie。 //cookie 是由服务器发送到浏览器的变量。 //cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。 //cookie 的名称指定为相同名称的变量。 //例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。 header ('Location: index.php');//重定向到index.php echo "I LOVE YOU COOKIES"; print_r(mysql_error()); echo '" />'; echo "
"; } else { print_r(mysql_error()); echo '" />'; } } } else //设置了cookie的情况下 { if(!isset($_POST['submit'])) { //没更新登录账户的时候 $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo '20.jpg" />'; echo '
" font size="
4">'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo '" font size="4">'; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
"; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); $sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1"; $result=mysql_query($sql); if (!$result) {//无结果 die('Issue with your mysql: ' . mysql_error()); } $row = mysql_fetch_array($result); if($row) {//有结果 echo '" font size="5">'; echo 'Your Login name:'. $row['username']; echo "
"; echo '" font size="5">'; echo 'Your Password:' .$row['password']; echo 'Your ID:' .$row['id']; } else { echo '" />'; } echo '" method="post">'; echo '" name="submit" value="Delete Your Cookie!" />'; //形成删除表单的按钮 echo ''; echo ''; } else { echo '#FFFF00" font size = 6 >'; echo " Your Cookie is deleted"; setcookie('uname', $row1['username'], time()-3600); header ('Location: index.php'); } //logging the connection parameters to a file for analysis. //记录操作信息 $fp=fopen('result.txt','a'); fwrite($fp,'Cookie:'.$cookee."\n"); fclose($fp); } ?> </body> >

你可能感兴趣的:(Sqli-labs 查看源代码 1-20)