CTF-WEB进阶
知识点1-弱类型问题
弱类型
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较。
== 在进行比较的时候,会先将字符串类型转化成相同的的,再比较。
当一个字符串被当作一个数值来取值时,其结果和类型如下:
如果该字符串没有包含 ‘.’,‘e’,‘E’ 并且其数值的值在整形的范围之内,该字符串被当作 int 来取值,其他所有情况下都被作为 float 来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用数值,否则其值为0。
例1
猜测key的值的类型为字符串,但是开始部分不是数字,使用HackBar Post一个message值:
message={‘key’:0}
即可获得flag。
例2
还是一样的题目,但是key的值发生了改变,无法使用例1的方法。
这种情况我们可以用穷举法,直接爆破一下:
message={‘key’: p a y l o a d payload payload}
弱类型-小结
知识点2-哈希(md5)绕过问题
我们想要绕过哈希验证,有以下几种方法:数组、0e开头的md5、字符串(md5碰撞)等等。
0e开头的md5
找到一对科学计数法形式md5值相等的字符串,即可实现绕过。
https://blog.csdn.net/weixin_45897324/article/details/108961503
数组
直接给一对数组,即可实现绕过。
演示数组,如何实现强相等
因为数组的md5值皆为null,所以两个不一样的数组结果都相等。
在URL上传两个数组,示例如下:
http://IP地址:端口/文件名.php?a[]=a1&a[]=a2
如果想要自定义键值对的键,可以在 [ ] 中写入 :
http://IP地址:端口/文件名.php?a[1]=a1&a[2]=a2
例1
解法
?a[3]=需注入payload&a[4]=需注入payload&a[0]=正常数据&a[1]=正常数据
http://IP地址:端口/文件名.php?a[3]=a1&a[4]=a2&a[1]=a3&a[2]=a4
既可以绕过数组的0,1元素的检查,又可以取前两个元素做拼接,执行命令。
字符串(MD5碰撞)
MD5碰撞
两个不同的东西拥有相同的md5:
https://www.jianshu.com/p/c9089fd5b1ba
例1
这个例子,我需要关注的代码,简化如下:
<?php $md5= $_GET['md5']; if ($md5==md5($md5))
我们只需给一个开头是0e形式的字符串,其md5值也是0e形式的。
知识点3-变量覆盖
变量覆盖,则是用传参的值替换掉原有的变量的值。
一般会考到的两个函数Extract(),Parse_str()
Import_requests_variables() //deprecated in php>=5.4.0
Import_requests_variables() 在php5.4.0之后就被废弃了
Extract()函数
例1
函数extract()重新给$arr 赋值
之后还有一句动态函数调用,可以通过此处进行攻击
$arr=(‘d’=system)
就可以通过post一个命令给a,实现攻击
Parse_str()函数
例1
函数parse_str()重新给$arr 赋值,
之后还有一句动态函数调用,可以通过此处进行攻击。
因为arr的值为d=system
所以parse_str($arr) 则会输出 $d=system
因为最后一句的动态函数调用,可以post一个a参数,进行攻击。
综合案例
分析代码,需要传一个值id, i d 会被进行重新赋值后面的 i f 判断 id会被进行重新赋值 后面的if判断 id会被进行重新赋值后面的if判断a的0号元素,不能等于 ‘QNKCDZO’ ,但是md5值,要与 'QNKCDZO’的md5值相等。而 ‘QNKCDZO’ 的md5值是0e开头的科学计数法。
构建payload
?id=a[0]=s878926199a
知识点4-命令执行漏洞
命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru()等函数,代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
如下:
cp /tmp/sourcefile /app/public/#{userinput}.jpg
漏洞位点
程序过滤不严谨,导致用户可以将代码注入并执行。
高危函数:eval()、assert()、preg_replace()、call_user_func()等等
对于执行命令的函数,参数过滤不严谨,导致直接命令执行。
高危函数:system(0)、exec()、shell_exec()、passthru()、pctnl_exec()、popen()、
proc_open() 注:反引号是shell_exec() 的别名
PHP:exec、shell_exec、system、passthru、popen、proc_open等
ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
漏洞利用
正常情况下,该代码中的 ip 参数是直接通过 GET 方式传入并直接带入了命令中,
这是可以尝试使用分隔符并添加一条命令。
知识点5-联合执行
分号
cmd1; cmd2; cmd3
cmd1将首先运行,不管cmd1运行成功还是出现错误,cmd2都会在它之后运行,当cmd2命令完成时,cmd3将会运行。
&&
有时候希望确保Linux命令中,只有在前一个命令成功结束时,下一个命令才会运行。这就是逻辑和运算符&&出现的地方:
cmd1 && cmd2 && cmd3
当第一个命令出现错误时,&&分隔的命令会停止执行后面的命令。
| |
可以使用逻辑操作符( || )运行命令行,但是只有在前一个命令出现错误时才运行下一个命令:
cmd1 || cmd2 || cmd3
如果cmd1运行失败,则运行cmd2。如果cmd2运行成功,cmd3将不会运行。
|
前一个命令的结果作为后一个命令的参数:
Cmd1 | cmd2
例如:echo xxx | base64
换行符
%0a;%0d,但不是所有编程语言中都能用于联合执行。
知识点6-Bypass
过滤空格
${IFS}
$IFS$9
<
<>
{cat,flag,php} //用逗号实现了空格功能,需要用{}括起来
%20
%09
过滤某关键字
ca\t yln\g.php //反斜杠绕过
cat yl’'ng.php //两个单引号绕过
echo “Y2F0IHkxbmcucGhw” | base64 -d | bash //base64编码绕过
echo “6361742079316E672E706870” | xxd -r -p | bash //hex编码绕过
cat yl[n]g.php //用[]匹配
cat yln* //用*匹配任意
cat yln?
cat yl{a…z}g
cat yl{a-z}g
内联执行
cat ‘ls | grep fla’ //查看flag
变量
a=fl; b=ag; cat a a ab.php
知识点7-代码执行漏洞
代码执行漏洞,由于服务器对危险函数过滤不严,导致用户输入的一些字符串可以被转换成代码来执行,从而造成代码执行漏洞。
常见代码执行函数:
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval|
Python: exec
${ }执行代码
<?php
${phpinfo()};
?>
eval
<?php
eval('echo "hello";');
?>
assert
<?php
assert($_POST['a']);
?>
洞。
常见代码执行函数:
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval|
Python: exec
${ }执行代码
<?php
${phpinfo()};
?>
eval
<?php
eval('echo "hello";');
?>
assert
<?php
assert($_POST['a']);
?>