前言

经过上一篇文章我们已经大概的了解sql注入去怎样审计了。但是在实际的网站中和用户的输入输出接口不可能想那样没有防御措施的。现在各大网站都在使用waf对网站或者APP的业务流量进行恶意特征识别及防护,,避免网站服务器被恶意入侵。所以我们就需要绕过waf,这篇文章就用代码审计的方式给大家讲解一些sql的绕过技巧。

关键字过滤

部分waf会对关键字进行过滤,我们可以用大小写或者双写关键字来绕过。

源代码分析

网络安全学习资料·攻略

<?php
require 'db.php';
header('Content-type:text/html;charset=utf8');
$username=dl($_POST['username']);
$password=dl($_POST['password']);
$dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登录界面后台处理
$ck=mysqli_query($db,$dl);
$row = mysqli_fetch_array($ck);
if($_POST['login']){if($row) {echo"你的密码".$row['username'];
}else{echo"登录失败";
}
}
function dl($gl){$gl=str_replace(array("union","UNION"),"","$gl");
$gl=str_replace(array("select","SELECT"),"","$gl");
$gl=str_replace(array("database","DATABASE"),"","$gl");
$gl=str_replace(array("sleep","SLEEP"),"","$gl");
$gl=str_replace(array("if","IF"),"","$gl");
$gl=str_replace("--","","$gl");
$gl=str_replace("order","","$gl");
return $gl;
}

分析一下代码,首先获取了数据,加载dl函数以后带入了数据库中执行,然后if判定是否有提交,是否登录成功,登录成功后回显用户的账号,这是一个非常简单的后台登录代码。往下看有一个自定义函数dl,函数内使用了str_replace(),str_replace()的作用是替换字符串,这里union,select,database ,if这些常用的注入字符大小写都被替换成空。做了一个简单的危险字符过滤自定义函数。

关键字过滤注入方法

用大小写和双写关键字来尝试绕过,返回代码里有回显位所以可以union注入,dl函数把union,select这些字符替换成空但是mysql中是不不区分大小写的,所以可以大小写混写来绕过dl函数的过滤。比如Select Union DAtabase()这样的字符是可以执行的。也可以用双写的手法,比如seselectlect这样的语句, dl函数会把里面的select替换为空这样两边的字符凑在一起刚好又是一个select这样就起到了绕过的作用。

大小写绕过语句为 -1’ unioN Select dataBASE(),2 #

双写关键字绕过语句为 -1’ ununionion selecselectt databasdatabasee(),2 #

都运行成功

or and xor not过滤

or and xor not 像这样的逻辑运算也会被过滤袋掉那我们怎么绕过呢?

源代码分析

<?php
require 'db.php';
header('Content-type:text/html;charset=utf8');
$username=dl($_POST['username']);
$password=dl($_POST['password']);
$zifu='/(and|or|xor|not)/i';
if(preg_match("$zifu","$username&&$password")){echo "<script>alert('存在危险字符')</script>";
}
$dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登录界面后台处理
$ck=mysqli_query($db,$dl);
$row = mysqli_fetch_array($ck);
if($_POST['login']){if($row) {echo"登录成功";
}else{echo"登录失败";
}
}
function dl($gl){$gl=str_replace(array("union","UNION"),"","$gl");
$gl=str_replace(array("select","SELECT"),"","$gl");
$gl=str_replace(array("database","DATABASE"),"","$gl");
$gl=str_replace(array("sleep","SLEEP"),"","$gl");
$gl=str_replace(array("if","IF"),"","$gl");
$gl=str_replace("--","","$gl");
$gl=str_replace("order","","$gl");
return $gl;
}
?>

阅读一遍代码发现在上一段的基础上面添加了一个preg_match函数,这个函数过滤了or and xor not关键字,需要注意的是preg_match会大小写都过滤,继续往下读回显位改成了成功或者失败所以我们只能采用盲注或者延时注入。

逻辑运算符绕过

先尝试大小写绕过,果然是失败的。

使用逻辑运算符尝试

and = &&

or = ||

xor = | # 异或

not = !

使用&&代替and构造盲注语句1’ && length(DATAbase())=3 # 因为关键字过滤函数还在所以还同时需要大小写绕过。

注入成功

url编码绕过

在平常使用url提交数据时,web容器在接到url后会自动进行一次url编码解析,但是由于业务问题有些网站在web容器自动解析之后,通过编写程序对解析的参数进行再次url编码解析,就会出大问题。

源代码分析

<?php
require 'db.php';
header('Content-type:text/html;charset=utf8');
$id1=$_GET['id'];
$gl="/and|or|not|xor|length|union|select|database|if|sleep|substr/i";
if(preg_match($gl,$id1)){echo"<script>alert('存在危险字符')</script>";
}else{$id=urldecode($id1);
$dl="SELECT * FROM xs WHERE id='$id'";
$result=mysqli_query($db,$dl);
$row = mysqli_fetch_assoc($result);
if($_GET['id']) {if ($row) {echo "登录成功:" . $row['username'];
}
}}
?>

上来还是先看看代码,把客户端传入的get参数赋值进了id1,用if加pregmatch对变量id1里的值进行检索。如果客户端传入的参数有gl里的值那么就会返回前端代码进行警告。没有危险字符才会执行下面的代码,接着把id1里的参数进行一次url解编码并赋值给$id。此时客户端传入的参数已经经过了两次url编码解析。最后过滤完成把id变量带入数据库中进行查询并返回用户的账号。

注入语句

分析代码时说到客户端传入的参数会进行两次url编码解析之后带入数据库,但危险过滤是在第一次解析之后第二次解析之前执行的。也就是说我们可以写入两次url编码过的语句绕过preg_match,比如and在过滤范围之中,对and一次url全编码后变为%61%6e%64%0,再进行一次编码为%25%36%31%25%36%65%25%36%34

。把经过两次编码后的and提交数据会经过web容器解码后变为%61%6e%64,preg_match判定就不会触发。

构造尝试语句

把-1’ union select database(),2,3 --+编码为-1’

%25%37%35%25%36%65%25%36%39%25%36%66%25%36%65 %25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 %25%36%34%25%36%31%25%37%34%25%36%31%25%36%32%25%36%31%25%37%33%25%36%35(),2,3 --+

成功绕过,代码执行带出了当前数据库。

最后

关注我持续更新技术文章,私我获取2021最新【网络安全学习资料·攻略

【网络安全】php代码审计-sql注入进阶篇相关推荐

  1. SQL注入回顾篇(四)

    前言 忆往昔,峥嵘岁月稠!大学已经到了大三了,打了很多比赛,回顾还是挺欣慰!此系列来由是想留一点东西,把所学知识整理一下,同时也是受github上Micro8分享的启发,故想做一些工作,以留后人参考, ...

  2. SQL注入回顾篇(一)

    前言 忆往昔,峥嵘岁月稠!大学已经到了大三了,打了很多比赛,回顾还是挺欣慰!此系列来由是想留一点东西,把所学知识整理一下,同时也是受github上Micro8分享的启发,故想做一些工作,以留后人参考, ...

  3. SQL注入进阶练习(一)一些进阶的注入方法

    SQL注入进阶练习 1. 二次注入 1.1 概念 1.2 sqllabs less-24 1.2.1 利用示例 1.2.2 原理剖析 1.3 网鼎杯2018 二次注入 1.3.1 环境搭建 1.3.2 ...

  4. DEV01-GBase 8a MPP Cluster SQL 编码进阶篇

    GBase 8a MPP Cluster SQL 编码进阶篇 一.概述: 二.常用内置函数 (一)函数体系 (二)内置函数的基本概念: (三)内置函数的使用位置: (四)内置函数概览 (五)数学函数 ...

  5. 【转载】SQL注入进阶

    被人黑怕了,每天在看别人怎么黑站,看到这文章还不错,就发上来了,希望大家提高安全意识啊, SQL注入天书 - ASP注入漏洞全接触 作者:NB联盟-小竹 来源:http://www.HackBase. ...

  6. 网络安全必学SQL注入

    1.1 .Sql注入攻击原理 SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞.要学会如何防御SQL注入,首先我们要学习它的原理. 针对SQL注入的攻击行为 ...

  7. 渗透测试——sql注入进阶/基于时间的盲注/一看就会/

    目录 一.注入点判断 注入类型 SQL注入的类型 二.基于时间的时间盲注 什么是时间盲注 sleep()函数 常用函数 三.bWAPP基于时间的盲注实战 一.注入点判断 1.输入一个单引号',因为语句 ...

  8. PHP代码审计-sql注入

    文章目录 前言 sql注入 字符型注入 魔术引号 编码注入 base64编码 url编码 宽字节注入 过滤方法 代码审计实战 前言 最近想学代码审计了,但是我本身的代码水平不高,学的比较基础,适合入门 ...

  9. 淡然qqyw图标点亮系统代码审计(sql注入)

    前言 此篇是关于sql注入挖掘的初级审计思路 本cms的安装程序在ino.php,数据库需要5.5的,5.7会报错 关键字搜索 SQL注入: select insert update mysql_qu ...

最新文章

  1. python列表解析式如何使用_python列表解析式,生成器,及部分内建函数使用方法...
  2. it编年史_Java的编年史和低延迟
  3. java 双重检查加锁弊端
  4. gtj2018如何生成工程量报表_如何更高效地使用EXCEL,一键生成报表?
  5. 无法连接到 visual studio 开发服务器
  6. 8盏流水灯反向闪烁c语言,课程设计(论文)_利用8255A芯片实现流水灯闪烁设计.doc...
  7. IO负载高的来源定位
  8. MATLAB2017安装VLFeat
  9. 临床阅片有新招!华为与维卓致远发布三维影像阅片系统
  10. 华为无线网代理服务器端口是什么意思,华为ES1D2G48SFA0 48端口十兆/百兆/千兆以太网电接口板(FA,RJ45) (适用于华为S7700系列交换机)...
  11. MAC系统下安装homebrew(2020.04)
  12. Anaconda安装虚拟环境
  13. Python实现BP神经网络ANN单隐层回归模型项目实战
  14. 推荐系统的评价指标笔记(NDCG、MAP、AUC、HR、MRR)
  15. MySQL数据库之约束
  16. hive中的分区表与视图
  17. 结构网格自适应(SAMR)——一种高效的多尺度问题解决方案
  18. 俊哥的blog的一道题
  19. 京东上货助手批量抓取淘宝商品步骤
  20. 4412 nfs网络设置

热门文章

  1. Py之pandas:字典格式数据与dataframe格式数据相互转换并导出到csv
  2. DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率
  3. STM32启动过程分析
  4. 实验 3:备份和还原配置文件
  5. 函数中返回char *类型
  6. tp5,thinkphp5,隐藏index.php,隐藏入口文件
  7. Intent 匹配规则
  8. 启动文件需要做的工作
  9. hdu 4352 XHXJ's LIS
  10. oracle 11g常用命令