宽字节SQL注入原理
来源:互联网 发布:c语言编程步骤 编辑:程序博客网 时间:2024/05/17 06:03
0x01:
经典的SQL注入利用的是没有任何防范措施的PHP使用SQL查询语句时可以通过URL输入造成该语句恒成立,从而可以获得数据库中的其他信息。
举个例子:
<?php $name=$_GET['name']; $conn=mysql_connect('localhost','root','root'); if($conn==null){exit("connect error !<br>");} mysql_select_db("aaa",$conn); $sql="select * from a1 where name='".$name."'"; $result=mysql_query($sql,$conn); while($val=mysql_fetch_row($result)){ print_r($val); print("<br>"); } ?>
在这里,可以输入:
(1) http://127.0.0.1/test/t1.php?name=a‘or ‘a’=’a
(2) http://127.0.0.1/test/t1.php?name=a‘or 1=1 – %20
(3) http://127.0.0.1/test/t1.php?name=a‘or 1=1 – %23
造成or与左右操作数组成的表达式成立,从而查到了包含name这一项的所有数据。
0x02:
如果使用转义符号对传入变量进行过滤的话,则经典的SQL注入语句就不能生效了。
这些转义函数包括:
addslashes() :
函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是:单引号(')双引号(")反斜杠(\)NULL
mysql_real_escape_string() :
函数转义 SQL 语句中使用的字符串中的特殊字符。下列字符受影响:
\x00\n\r\'"\x1a
mysql_real_escape_string() :
函数转义 SQL 语句中使用的字符串中的特殊字符。下列字符受影响:
\x00\n\r\'"\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
这时候,我们就只能利用另一种被称为宽字节注入的方法进行注入了。
0x03:
宽字符是指多个字节宽度的编码,如UNICODE、GBK、BIG5等。转义函数在对这些编码进行转义时会丢掉转义字符“\”(将它转换为%5C),你可以在它前面再输入一个单字符编码与它组成一个新的多字符编码,使得转义实际上没有发生作用(转义就是要留下“\”防范注入的)。
举个例子:
输入……php?name=a%df’ or 1=1;%20%23
转义函数会将%df’改成%df\’,如果你的编码是GBK,%df\’就对应着%df%5c’,在GBK中,这两个字节%df%5c又对应着一个汉字“運”,也就是说\已经失去了作用,a%df’被认为是a運’,成功消除了转义函数的影响。
0x04:
总结一下,可以进行宽字节注入的条件有两个:
(1)需要设置宽节字符集。
(2)这个宽字节字符集第二个字符编码的%5c与第一个字符编码组成的多字符编码要有意义。
0x05:
举一个典型的宽字节注入例子:
<?php $name=$_GET['name'];$name=addslashes($name);$conn = mysqli_connect('localhost', 'root', 'root', 'test');//连接MySQL服务if (!$conn) { die('Could not connect to MySQL: ' . mysqli_connect_error()); } $conn->set_charset("GBK");@mysql_select_db("test",$conn);$sql="select * from user where username='".$name."'";$result=mysqli_query($conn,$sql);@$row = mysqli_fetch_assoc($result);echo "Hello ".$row['username']."</br>";echo "Your password is:".$row['password']."</br>";?>
若将这段代码保存为1.php,数据库如图设置:
则注入语句:
..php?name=a%df’ or 1=1; %20%23
得到结果:
- 宽字节SQL注入原理
- sql宽字节注入详解
- sql宽字节注入详解
- sql注入之宽字节注入
- (学习)SQL注入--宽字节注入
- SQL注入——宽字节注入
- [转载]sql宽字节注入详解
- 关于SQL宽字节注入的学习
- SQL注入教程——(四)宽字节注入
- 深入探究宽字节注入漏洞与修补原理
- 深入探究宽字节注入漏洞与修补原理
- CTF/CTF练习平台 --SQL注入测试【sql宽字节注入与#,%23】
- sql注入漏洞原理
- SQL注入原理,值得一看!
- SQL注入原理
- SQL 注入原理
- SQL注入原理,值得一看!
- SQL注入原理,值得一看!
- App数据分析到底要分析什么
- Flume之Failover和Load balancing原理及实例
- 【python 处理亿级数据】使用 Pandas 处理亿级数据
- 局部内部类里面的方法如何调用类所在方法里面的变量
- ajax跨域请求传输cookie
- 宽字节SQL注入原理
- java 设计模式
- [2017.12.02-03]多线程
- 进程间通信方式
- 开发高并发系统时保护系统的三把利器:缓存、降级和限流
- SharePoint Framework 自定义field示例中的gulp server运行错误
- Linux用户管理 (实验2)
- 高并发秒杀系统
- Flume + Keepalived构建高可用分布式采集系统