前言
还是南邮的一些题,比较基础的。仍然需要学习一些web知识,上次做着做着 因为证书的问题burp还没有解决。。正在努力尝试解决这个问题。。。这次估计用到burp 的题 还是动不了了。。。
web1:/0xx
点开题目链接后发现是代码审计….题目提示有多种的做法,先看看代码。发现有个ereg函数跟strops函数
不太明白这两个函数的作用去看了看
PHP 函数 ereg()
语法
`int ereg(string pattern, string originalstring, [array regs])
定义和用途`
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。
Return Value
如果匹配成功返回true,否则,则返回false
还发现了一篇文章:https://www.jianshu.com/p/7b732d4b8eac
发现ereg函数有截断漏洞ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配,发现文章中例子跟这道题目用的函数基本一致
也就是说nctf变量必须是数字,当遇到%00(NULL)时,函数就截止了。
还有一个函数strpos() 函数查找 “php” 在字符串中第一次出现的位置:
定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
strpos() 函数对大小写敏感。
这在题目中就是strpos ($_GET[‘nctf’], ‘#biubiubiu’)函数要求nctf变量中需要包含’#biubiubiu’字符串,才能返回。
了解完来试试
不会的函数还是问问度娘好使。。最终拿到flag
web2:bypass again
点进去 发现好像还是代码审计
get一个变量
还有isset函数
定义和用法
isset() 函数用于检测变量是否已设置并且非 NULL。
如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。
同时要注意的是 null 字符(”\0”)并不等同于 PHP 的 NULL 常量。这里应该是设置isset检测ab不为空
再看发现代码的意思是让两个不一样的数使他们的md5相等,md5()函数要求接收一个字符串,若传递进去一个数组,则会返回null(加了‘ ’就相当于字符串的代表了)
因此向$_GET数组传入两个名为a、b的不相等的数组,从而导致md5()均返回空输出信息 退出脚本。
这种题前面有类似,考察md5碰撞,只要md5值开头为0ed, ==会认为两边都为0,即为true这样就好弄了根据前面的题a=240610708&b=QNKCDZO 还可以?a[]=&b[]=1 这样比较简单 这是因为md5不能处理数组结构的数据。出错返回的空NULL==NULL
web3:变量覆盖
看到一个输入框,难不成是XSS或者SQL注入的类型题目吗
题目说是变量覆盖 先找到相关的看看基础知识。
原来还是代码审计的相关知识里面的
代码审计|变量覆盖漏洞
那之后来干一波。
映入眼帘的 还是一大波代码果然还是代码审计
$password 等于$thepassword_123就能够得到flag了
这样构造一下得到flag
web4:php是世界上最好的语言
好像题目崩了
等等看再写。
web:5伪装者
告诉我不是本地登录 然后只有本地 题目又是伪装者 看来是伪造IP 应该可以抓包改包 来过 可是burp暂时不能用, 试试火狐的软件
。。。不知道为啥 这样保存后不让用,,,暂时没了思路 等正好burp再来战。这样伪造应该也是可行的。
web6:SQL注入1
点进去 看账号密码都有提交白 看看有啥信息
Secure Web Login
You are not admin!
告诉我不是admin 那就再点开Source
看到重点
不是说好的注入吗 突然有了审计的味道。
1框说明 user 是 admin,所以要想办法避免密码的验证
在2中:$sql=”select user from ctf where (user=’”.$user.”‘) and (pw=’”.$pass.”‘)”
我们通过审计发现注入点 在(user=’”.$user.”‘)做手脚,在Username处输入 admin’)#
输入 admin’)#
因为后面的语句被#注释了,要把源码原来的)补上。
web7: pass check
打开就是源码
看源码只要(!strcmp($pass,$pass1))条件成立就可得到flag。
strcmp()是用于比较字符串的函数
定义:
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。
如果 str1 小于 str2 返回 < 0;
如果 str1 大于 str2 返回 > 0;
如果两者相等,返回 0。
因此尝试数组绕过,只要我们$_POST[‘pass’]是一个数组或者一个对象就搞定了。
web8:起名字真难
。。题目挺有意思 不过起名字确实很难
看看代码 nother_says_correct 没有其他精确的方法?/?…先往下看 百度这个给了我一个是数字验证正则绕过的类型题目,继续看 题目告诉我们是 输入key,key的值需要等于54975581388,但是key的每一位数字不能是1-9
ord()函数返回字符串的首个字符的 ASCII 值。
不让输入数字还让等于54975581388 这进制转化白 转化成16进制0xccccccccc
得到flag
总结
暂时做到这,对代码审计又有了进一步的认识。