Sqli-labs 查看源代码 1-20


Less-1:

index.php

<?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 "<font size='5' color= '#99FF00'>";
    echo 'Your Login name:'. $row['username'];

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

    }
    else 
    {//查询不到结果
    echo '<font color= "#FFFF00">';
    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

<?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

<?php

//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 "</font>";  
    }
}
  • 单引号、字符型:
// 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 '<font color= "#FFFF00">';
    print_r(mysql_error()); //返回详细的错误结果
    echo "</font>";  
    }
  • 整型:

$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 "<br>";
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 "</font>";  
    }
}

Less-8:

基于布尔 - 单引号 - 盲注

  • 基于布尔 盲注

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

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

    if($row)
    {
    echo '<font size="5" color="#FFFF00">'; 
    echo 'You are in...........';
    echo "<br>";
        echo "</font>";
    }
    else 
    {

    echo '<font size="5" color="#FFFF00">';
    //echo 'You are in...........';
    //print_r(mysql_error());
    //echo "You have an error in your SQL syntax";
    echo "</br></font>";    
    echo '<font color= "#0000ff" font size= 3>';    

    }
  • 单引号
// 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 '<font size="5" color="#FFFF00">'; 
    echo 'You are in...........';
    echo "<br>";
        echo "</font>";
    }
    else 
    {

    echo '<font size="5" color="#FFFF00">';
    echo 'You are in...........';
    //print_r(mysql_error());
    //echo "You have an error in your SQL syntax";
    echo "</br></font>";    
    echo '<font color= "#0000ff" font size= 3>';    

    }
}

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 '<font color= "#0000ff" font size="3">';
        //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 '<img src="../images/flag.jpg"  />';
    }
    else  
    {
        //
        echo '<img src="../images/slap.jpg"   />';
    }

  • 单引号 字符型(盲注)
// 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 '<img src="../images/flag.jpg"  />';
    }
    else  
    {
        echo '<img src="../images/slap.jpg"  />';
    }
  • 双引号(括号) - 字符型(盲注)
// 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
<?php
$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 '<font color= "#FFFF00" font size = 3 >';
            //echo " You password has been successfully updated " ;     
            echo "<br>";
            echo "</font>";
        }

        echo '<img src="../images/flag1.jpg"   />'; 
    }

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 "<br>";
    echo 'Your IP ADDRESS is: ' .$IP;
    echo "<br>";
  • 基于错误
$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 '<font color= "#0000ff" font size="3">';
        print_r(mysql_error()); //输出详细错误
        echo '<img src="../images/slap.jpg"   />';
        echo "</font>";  
        }
  • 字符型
$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 '<img src="../images/flag.jpg" />';

}
else
{
    echo '<font color= "#0000ff" font size="3">';

    print_r(mysql_error());
    echo '<img src="../images/slap.jpg"  />';
}   
  • 字符型
$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注入

<?php
//including the Mysql 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&nbsp;&nbsp;&nbsp;<font color='#FF0000'> Dhakkan </font><br></div>";
    echo "<!--Form to post the contents -->";

    //形成两个表单username和password

    echo '<form action=" " name="form1" method="post">';

    echo ' <div style="margin-top:15px; height:30px;">Username : &nbsp;&nbsp;&nbsp;';
    echo '   <input type="text"  name="uname" value=""/>  </div>';

    echo ' <div> Password : &nbsp; &nbsp; &nbsp;';
    echo '   <input type="text" name="passwd" value=""/></div></br>';   
    echo '   <div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="submit" value="Submit" /></div>';


    echo '<img src="../images/Less-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 '<img src="../images/flag.jpg" />';
                echo "<br>";
                }
            else
                {
                print_r(mysql_error());
                echo '<img src="../images/slap.jpg" />'; 
                }
            }



}
else  //设置了cookie的情况下
{

    if(!isset($_POST['submit']))
        {   //没更新登录账户的时候

            $cookee = $_COOKIE['uname'];
            $format = 'D d M Y - H:i:s';
            $timestamp = time() + 3600;

            echo '<img src="../images/Less-20.jpg" />';

            echo '<br><font color= "red" font size="4">';   
            echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];

            echo '<font color= "cyan" font size="4">';  
            echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];          
            echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";

            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 color= "pink" font size="5">';  
                echo 'Your Login name:'. $row['username'];
                echo "<br>";
                echo '<font color= "grey" font size="5">';      
                echo 'Your Password:' .$row['password'];

                echo 'Your ID:' .$row['id'];
                }
            else    
                {               
                echo '<img src="../images/slap1.jpg" />';
                }

            echo '<form action="" method="post">';
            echo '<input  type="submit" name="submit" value="Delete Your Cookie!" />';
            //形成删除表单的按钮
            echo '</form>';
            echo '</center>';
        }   
    else
        {

        echo '<font color= "#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>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值