3D打印|php代码审计-sql注入进阶篇

3D打印|php代码审计-sql注入进阶篇

文章图片

3D打印|php代码审计-sql注入进阶篇

文章图片

3D打印|php代码审计-sql注入进阶篇

前言经过上一篇文章我们已经大概的了解sql注入去怎样审计了 。 但是在实际的网站中和用户的输入输出接口不可能想那样没有防御措施的 。 现在各大网站都在使用waf对网站或者APP的业务流量进行恶意特征识别及防护 ,, 避免网站服务器被恶意入侵 。 所以我们就需要绕过waf , 这篇文章就用代码审计的方式给大家讲解一些sql的绕过技巧 。
关键字过滤部分waf会对关键字进行过滤 , 我们可以用大小写或者双写关键字来绕过 。
源代码分析<?phprequire '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这些常用的注入字符大小写都被替换成空 。 做了一个简单的危险字符过滤自定义函数 。
① 2000多本网络安全系列电子书(整理真的很花时间)
② 网络安全标准题库资料(面试题啥的)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ 网络安全基础入门、Linux、web安全、攻防方面的视频(适合小白学习)
⑤ 网络安全学习路线图(给不知道从何开始学的大宝贝)
单独发我”安全“即可
关键字过滤注入方法用大小写和双写关键字来尝试绕过 , 返回代码里有回显位所以可以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>\";