admin管理员组文章数量:1794759
零基础从sqli
纯安服小白,想自学入坑一点,无基础也没有头绪,打算从打靶场开始一点点扩展开学习,如果有大佬愿意带带我的话感激不尽TAT
文中内容皆为自己查资料以及一部分个人理解,不保证完全正确,如果有错误的地方非常欢迎大佬们提出指导。
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)提示输入数字型参数作为ID
输入?id=1,url中,?后为参数。出现用户名密码,表示获取到数据库中的数据,不同的id可获得不同的数据。
判断注入点此处判断出SQL注入的第一个条件:可能存在注入的位置。GET的参数id是与数据库进行交互的点
在数字参数后加单引号,判断语句是否拼接以及是字符型还是数字型。
单引号报错,双引号不报错,推测语句闭合方式为单引号。加单引号报错,说明参数类型是字符型。(参考sql注入基础原理(超详细)_牛牛Blog的博客-CSDN博客_sql注入攻击的原理^v52^pc_rank_34_queryrelevant25,201^v3^add_ask&spm=1018.2226.3001.4187)
在单引号后加上注释符号(#或--+等),验证闭合方式。
判断第二个条件:是否能注入id分别为1' and 1=1 --+和1' and 1=2--+,通过回显情况,进一步判断能否注入。1=1为永真,当1成功查询,若1=1也成功查询,则页面返回正常,1=2为永假,因此若1=2得到执行,则页面必返回不正常。通过对比二者返回结果,可知改点能否进行注入。
mysql数据库可以通过and 1=1和and 1=2来判断字符型还是数字型,输入?id=1 and 1=1和?id=1 and 1=2时,返回的都是id=1的结果,是由于id是一个int型的数值,无论是1还是1 and 1=1都判断为1,所以返回id=1的结果;如果是数字型,则?id=1 and 1=1返回id=1的结果,?id=1 and 1=2会没有回显,因为id=1是正确语句可以被查询,而1=2是永假,所以会有异常或无回显。
实际执行命令为SELECT name,password FROM 表 WHERE id = ‘1’ and 1=1 --+'(由于是字符型,所以需要将最后的单引号注释,保证可以正常执行。如果是数字型,则不需要加单引号,实际执行命令为SELECT name,password FROM 表 WHERE id = 1 and 1=1)
联合注入union存在sql注入漏洞,接下来使用联合查询,联合查询需要两张表列数相同,所以先判断当前表的列数。order by 4时报错,表示超过列数(order by 1和order by列名没有什么区别,超过当前有的列数之后会报错,常用于判断列数)
联合查询union,将多条select语句的结果合并到一起,要求查询时多个select语句的检索到的字段数量必须一致,每一条记录的各字段类型和顺序最好一致,union默认去重,可使用union all包含重复项
联合查询union select1,2,3(前面order by得到的列数),可以显示我们插入的语句的返回位置。(参考链接:union select的使用sql注入中的union联合查询,union select 1,2,3_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入unionselect)
回显没有变化是因为union查询中前半部分id=1查询成功,因为源码中带了一个limit 0,1的语句,所以只回显是第一个也就是id=1的结果,就不会回显select 1,2,3的内容,所以我们要让前半部分查询失败,就会显示后半部分的内容(具体解释看上面那个参考链接)
因为id是从1开始的,所以id=-1时是查询不到的,这时候回显显示的就是select 1,2,3的结果,回显的是2,3的部分,也说明这里可以进行sql注入
使用mysql数据库中的一些函数获取一些数据信,此处获取当前数据库名和版本号,使用database(),version()函数
获取该数据库中的表信。将group_concat(table_name) from information_schema.tables where table_schema='security'--+ 翻译成人话就是:从information_schema数据库中的tables表中查找数据库security所含有的表有哪些
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
mysql语法:select xxx,xxx,xxx from xxx where xxx,犯傻写成?id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security',3--+结果就报错了,应该是?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
获取表信之后可以看到,security数据库中包含四个表,推断账号密码信存在user表中,下一步获取字段信。
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。
可以看到user表中有username和password字段,判断账号密码对应这两个字段。中间的id起到分隔账号和密码的作用,可以用其他代替。
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
参考链接:
版权声明:本文标题:零基础从sqli 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1687071109a131148.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论