请mysql高手赐教:关于mysql的注入式攻击的一个问题

yechat 2004-05-02 05:46:08
有一PHP页面,其ID未经检验就放入了SQL语句中。
现在无法得知其表名,列名只知道一个。
如何取得表名?
不要告诉我慢慢猜。
我对MYSQL不熟,不过知道不能用子查询,有没有方法可以跟MSSQL一样这样取得系统对像:
select * from sysobjects where xtype='u'
另外,如果不能这样取得,可否用union,但是我不知道这个PHP页面所用的recordset有几列。那么怎么构造union的列名?

请mysql高手赐教。
...全文
150 33 点赞 打赏 收藏 举报
写回复
33 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yechat 2004-09-09
To: waterpub(一夜听雨)
Tks.
  • 打赏
  • 举报
回复
zzhhll003 2004-05-13
up
  • 打赏
  • 举报
回复
waterpub 2004-05-12
some data:http://www.manyi100.com/view.asp?id=859
  • 打赏
  • 举报
回复
yechat 2004-05-06
to:syre(北冥有鱼)

谢谢。
不过请看清楚我的问题。

谢谢
  • 打赏
  • 举报
回复
-神仙- 2004-05-06
mysql_list_fields
(PHP 3, PHP 4 )

mysql_list_fields -- 列出 MySQL 表中的字段
说明
resource mysql_list_fields ( string database_name, string table_name [, resource link_identifier])


mysql_list_fields() 取得给定表名的信息。参数是数据库名和表名。返回一个结果指针,可以用于 mysql_field_flags(),mysql_field_len(),mysql_field_name() 和 mysql_field_type()。

例子 1. mysql_list_fields() 例子

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

$fields = mysql_list_fields("database1", "table1", $link);
$columns = mysql_num_fields($fields);

for ($i = 0; $i < $columns; $i++) {
echo mysql_field_name($fields, $i) . "\n";
}


以上例子将产生如下输出: field1
field2
field3
...




mysql_list_tables
(PHP 3, PHP 4 )

mysql_list_tables -- 列出 MySQL 数据库中的表
说明
resource mysql_list_tables ( string database [, resource link_identifier])


mysql_list_tables() 接受一个数据库名并返回和 mysql_query() 函数很相似的一个结果指针。用 mysql_tablename() 函数来遍历此结果指针,或者任何使用结果表的函数,例如 mysql_fetch_array()。

database 参数是需要被取得其中的的表名的数据库名。如果失败 mysql_list_tables() 返回 FALSE。

为向下兼容仍然可以使用本函数的别名 mysql_listtables(),但反对这样做。


注: 该函数已经被删除了,请不要再使用该函数。您可以用命令 SHOW TABLES FROM DATABASE 来实现该函数的功能。


例子 1. mysql_list_tables() 例子

<?php
$dbname = 'mysql_dbname';

if (!mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
print 'Could not connect to mysql';
exit;
}

$result = mysql_list_tables($dbname);

if (!$result) {
print "DB Error, could not list tables\n";
print 'MySQL Error: ' . mysql_error();
exit;
}

while ($row = mysql_fetch_row($result)) {
print "Table: $row[0]\n";
}

mysql_free_result($result);
?>


这些东西php手册都有的
  • 打赏
  • 举报
回复
yechat 2004-05-06
另外补充一点:服务器上mysql的版本是4.0.17-standard。
在shell下是可以用;(分号)分隔多条语句的。
  • 打赏
  • 举报
回复
yechat 2004-05-06
to:xuzuning(唠叨)

我觉得问题不在PHP里边。
get_magic_quotes_gpc:
设为 1 时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
这其中未包含;(分号)。
而且,当用'(单引号)时,页面返回的错误信息是:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
很明显,这是因为PHP对单引号进行了转义。

而使用;(分号)时,页面返回的错误信息是:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ';select 1 from t1' at line 1
也就是说分号没有被PHP转义。
问题出在MYSQL身上。

请版主及各位同志再帮忙看看问题出来哪。为什么不能用多条语句。
谢谢!

  • 打赏
  • 举报
回复
-神仙- 2004-05-06
但是这是要在php.ini里设置的
function slash($str,$tran=0){
$t=trim($str);
if (get_magic_quotes_gpc() && !$tran)
$t=stripslashes($t);
elseif (!get_magic_quotes_gpc() && $tran)
$t=addslashes($t);
return $t;
}
这个更保险一点
$trans=0:强制不转换
$trans=1:强制转换
另外,如果id是整数的话可以用(int)$id
这样就可以杜绝注入攻击
  • 打赏
  • 举报
回复
xuzuning 2004-05-06
这是很正常的,php已经在防止象您这样的攻击者了。
当php发现查询串中有";"时将对查询串做特殊处理,以防止注入式攻击

所以通过php访问数据库是比较安全的。
  • 打赏
  • 举报
回复
feixuehenshui 2004-05-06
HOHO
反正我的ID 有用了 INTVAL
  • 打赏
  • 举报
回复
yechat 2004-05-06
to:countstars(深空)
请看清楚我的问题,谢谢。
  • 打赏
  • 举报
回复
yechat 2004-05-06
to:feixuehenshui(飞雪恨水)
当然会!
在PHP中字符串才不会。因为magic_quotes_gpc。
这是PHP+MYSQL与ASP+MSSQL的差别。
ASP+MSSQL的数值也会有注入漏洞,但一般程序员都会用Cint(Request.Form("Var"))进行强制转换,所以相对而言ASP对字符串下手进行注入比较容易。
  • 打赏
  • 举报
回复
yechat 2004-05-06
请版主:xuzuning(唠叨) 指教:

问题是我现在注入只能这样:
比如URL是:http://hostname/index.php?id=1
PHP语句如:
$var=1;
&strSql="select * from t1 where id=".$var;

那么我可以这样:
http://hostname/index.php?id=1 or 1=1 #

但是我还想update数据(当前连接的用户在表t1上有update的权限):
那么我想构造形如:
http://hostname/index.php?id=1;update t1 set password=0 where id=1#
这样的语句在mysql命令行是没有问题的,
但是在用在这个URL SQL注入时mysql报错:在;update t1 set password=0 where id=1#附近参数错误。

这是什么原因??

谢谢!

  • 打赏
  • 举报
回复
countstars 2004-05-06
加上单引号就可以了,id = '$id'
当然,SQL要转意,默认已经转了,除非你修改了php配置
  • 打赏
  • 举报
回复
feixuehenshui 2004-05-06
to yechat(点尘不惊
数植怎么会引起注入漏洞?
  • 打赏
  • 举报
回复
yechat 2004-05-06
楼上的,在sql injection时,能用show tables???怀疑

原语句形如:
$var=1;
&strSql="select * from t1 where id=".$var;

我当然是想SQL注入咯~


  • 打赏
  • 举报
回复
xuzuning 2004-05-06
一PHP页面,其ID未经检验就放入了SQL语句中。
现在无法得知其表名,列名只知道一个。
如何取得表名?

show tables

不知你想干什么?
  • 打赏
  • 举报
回复
yechat 2004-05-06
楼上的,当然有注入的漏洞咯。
如果你是用PHP那么,且Request回的变量是字符串,那么直接放入sql语句是没问题的,因为PHP的magic_quotes_gpc选项会把所有引号转义为"\'",那么是不存在漏洞的。这也是我厌恶PHP的地方。
但如果你Request回来的是数值,并且直接放入了Sql语句,那么这就是注入漏洞。
  • 打赏
  • 举报
回复
xylegend 2004-05-04
想问一个问题,对于表单只是用JS做了非空判断,是否会有此注入漏洞?(MySQL)
虽然我的是用了session验证,但还是可以重复提交而且没有过滤'等
  • 打赏
  • 举报
回复
xylegend 2004-05-04
up
有意思,我的小站点就有这个问题,不过我懒得去改动了
反正我是没有打算放到外边去(没有免费的空间)^_^
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
基础编程
加入

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2004-05-02 05:46
社区公告
暂无公告