<ํฌ๋งท ์คํธ๋ง>
- ์ ๊ฒ ๋ด์ฉ : ์น ์ ํ๋ฆฌ์ผ์ด์ ํฌ๋งท ์คํธ๋ง ์ทจ์ฝ์ ์กด์ฌ ์ฌ๋ถ ์ ๊ฒ
- ์ ๊ฒ ๋ชฉ์ : ๊ณต๊ฒฉ์์ ํฌ๋งท ์คํธ๋ง ์ทจ์ฝ์ ์ ํตํ ์ ์์ ์ธ ํ์๋ฅผ ์ฐจ๋จํ๊ธฐ ์ํจ.
- ๋ณด์ ์ํ : C์ธ์ด๋ก ๋ง๋๋ ํ๋ก๊ทธ๋จ ์ค ๋ณ์์ ๊ฐ์ ์ถ๋ ฅํ๊ฑฐ๋ ์ ๋ ฅ๋ฐ์ ๋, ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์กฐ์ํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๋ฐํ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณ์กฐํ์ฌ ์์คํ ์ ๊ด๋ฆฌ์ ๊ถํ์ ํ๋ํ ์ ์์.
** ๋ฉ๋ชจ๋ฆฌ ์์น -> ์๋ฒ ์ทจ์ฝ์
** ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ๋ํด error๊ฐ ๋จ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ <๋ฒํผ ์ค๋ฒํ๋ก์ฐ>์ ๋๊ฐ๋ค.
- ๋์ : ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ค์ฝ๋, ์น ๊ธฐ๋ฐ C/S ํ๋ก๊ทธ๋จ.
** C/S ํ๋ก๊ทธ๋จ : ์ธํฐ๋ท์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ(๋์ฌ๊ด ์๋ฆฌ ์์ฝ ์ฑ, ์๋น ํค์ค์คํฌ) -> ์๋ฐํ๋ ์น ์ทจ์ฝ์ ๋ถ์์ด๋ผ๊ณค ํ ์ ์๋ค.
<LDAP ์ธ์ ์ >
- // ํธ๋ฆฌ ํํ์ ์๋ฃ ๊ตฌ์กฐ(ex. ์กฐ์ง์ฒด๊ณ๋) - ์ทจ์ฝํ์ง๋ง ์ธ์๊ด๋ฆฌ์ ์ฉ์ดํด์ LDAP๋ฅผ ์ฌ์ฉํ๊ณค ํ๋ค.
- ์ ๊ฒ ๋ด์ฉ : ์น ํ์ด์ง ๋ด LDAP ์ธ์ ์ ์ทจ์ฝ์ ์ ๊ฒ
- ์ ๊ฒ ๋ชฉ์ : ์ทจ์ฝํ ์์คํ ์ ์ ๋ขฐํ ์ ์๋ LDAP ์ฝ๋ ์ฝ์ ๊ณต๊ฒฉ์ ํตํ ๋น์ธ๊ฐ์์ ์ ์์ ์ธ ํ์๋ฅผ ์ฐจ๋จํ๊ธฐ ์ํจ.
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
ex) "(์ฟผํฐ)๋ฅผ ํตํด ์์๋ฅผ ๋ณด์ด๊ฒ ๋ค.
1. ๋ค์ ์ฒ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ด ์๋ค.
~~~์ฟผ๋ฆฌ๋ฌธ~~~ "์ด๋ฆ" ~~~
2. ์ฟผํฐ๋ฅผ ํ๋ ๋ฃ์ผ๋ฉด ๋ณ์๋ก ๋ฌถ๋ ์ฟผํฐ๊ฐ ํ์์ด ์ด๋ฆ ์์์ ๋ง๋ฌด๋ฆฌ ๋๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
(SQL-injection)
~~~์ฟผ๋ฆฌ๋ฌธ~~~ ""์ด๋ฆ" ~~~
3. ํน์ ๋ค์ ์ฒ๋ผ ์ฟผํฐ๋ฅผ 2๊ฐ ๋ฃ์ผ๋ฉด ๋์์ ์ฟผํฐ์ ์ฌ์ด์ ๊ณต๊ฐ์ด ์๊ฒจ์ ๊ทธ ๊ณต๊ฐ์ ๋ง์๋๋ก ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฐ์ด ์๊ธด๋ค.
~~~์ฟผ๋ฆฌ๋ฌธ~~~ "" [๋ง์๋๋ก ์ธ ์ ์๋ ๊ณต๊ฐ] "" ~~~
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
- ๋ณด์ ์ค์ ๋ฐฉ๋ฒ : ํน์ ๊ธฐํธ๋ฅผ ํตํ injection์ด ๋ถ๊ฐ๋ฅํ๋๋ก ์ค์ ํด์ผ ํ๋ค.
- ' ์ฑ๊ธ ์ฟผํฐ
- " ๋๋ธ ์ฟผํฐ
- -- ์ฃผ์
- # ๋์ ์ฟผ๋ฆฌ
- (
- )
- =
- /*
- */
- +
- <
- >
- *
- ;
- &
- |
<SQL injection>
- ** ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ๋ฐ์.
- ์ ๊ฒ ๋ด์ฉ : ์นํ์ด์ง ๋ด SQL ์ธ์ ์ ์ทจ์ฝ์ ์กด์ฌ ์ฌ๋ถ ์ ๊ฒ
- ์ ๊ฒ ๋ชฉ์ : ๋ํํ ์น ์ฌ์ดํธ์ ๋น์ ์์ ์ธ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ ํ์ฉ์ ์ฐจ๋จํ์ฌ ์ ์์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๋ฐ ์กฐ์์ ๋ฐฉ์งํ๊ธฐ ์ํจ.
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
ex)
์ด๋ค ์ฌ์ดํธ์์ ๊ณ์ ์ ์์ฑํ ๋, ๋ช๊ฐ์ง ํน์๊ธฐํธ๋ค์ ๋ชป์ฐ๊ฒ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณธ์ ์ด ์์ ๊ฒ์ด๋ค.
-> SQL-injection ๋๋ฌธ์ ํด๋น ํน์๊ธฐํธ๋ค์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ ๊ฒ์ด๋ค.
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
- SQL-injection์ ์๋ํ ๋, ๊ฐ์ฅ ๋จผ์ ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋๋ ์์น๋ฅผ ์ฐพ์์ผ ํ๋ค.
- ์ฆ, ๋ช๊ฐ์ง ํน์๊ธฐํธ๋ฅผ ๋ฃ์ด๋ณด๊ณ ์ค๋ฅ๋ฌธ์ด ์ถ๋ ฅ๋๋ฉด SQL๋ก ์ธ์๋ ๊ฒ์ด๊ณ , ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋๊ณ ์์์ ์์์ผ ํ๋ค.
- ์ฑ๊ธ์ฟผํฐ์ ๋ ฅ์ผ๋ก(ํน์๊ธฐํธ ์ ๋ ฅ์ผ๋ก) ์ค๋ฅ๋ฉ์์ง๊ฐ ๋จ๋ฉด -> SQL-injection์ฑ๊ณต
- ์ฑ๊ธ์ฟผํฐ์ ๋ ฅ์ผ๋ก(ํน์๊ธฐํธ ์ ๋ ฅ์ผ๋ก) ์ค๋ฅ๋ฉ์์ง๊ฐ ๋จ์ง ์์ผ๋ฉด -> Blind SQL-injection.(๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฌธ์ด ์๋จ๊ฒ ์ค์ ํด๋์์ ๋ฟ, SQL๋ก ์ธ์์ ๋ ๊ฒ.)
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
OR 1=1 ์ ์ฐ๋ ๊ฒฝ์ฐ -> ID๋ณด๋ค๋ PW์ ์ฐ๋ ๊ฒ์ด ์ข๋ค.
์๋ํ๋ฉด ID์ OR 1=1๋ฅผ ์ฐ๊ณ ์ ์ํ๋ ๊ฒฝ์ฐ, ์ด๋ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ๋์๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๊ทธ๋ณด๋ค๋ ํน์ ID๋ฅผ ์์๋ธ ํ, PW์ OR 1=1 ๋ฅผ ์ ๋ ฅํ์ฌ ์ ์ํ๋ฉด ํด๋น ID๋ก ์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
*๋ก๊ทธ์ธ์ ์ฐธ,๊ฑฐ์ง์ ํ๋จํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ OR 1=1 ์ url์๋ค๊ฐ ๋ฃ๋ ๊ฒ์ ๋ฐ๋ณด์ง์ด๋ค.^^.
-> url์๋ค๊ฐ๋ ์ฟผํฐ์ ๊ฐ์ ํน์๊ธฐํธ ์ ๋ ฅ์ ํตํด SQL๋ก ์ธ์๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ด๋ฆฌ์ ID๋ ์ฌ์ดํธ ๋งจ ํ๋จ์ ๊ธฐ์ฌ๋ ์ด๋ฉ์ผ ์ฃผ์์ ๋น์ทํ ๊ฒฝ์ฐ๋ ์๋ค.
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์ง๊ธ๋ถํฐ๋ SQL-injection ํด๊ฒฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ๋ค.
๋จผ์ , ASP.net์ ๊ฒฝ์ฐ์ด๋ค.
ASP.net
๋ฐฉ๋ฒ1. ํน์ ํํฐ๋ง ์ ์ฉ
private string SafeSqlLiteral(string inputSQL)
{
Str = inputSQL.Replace("'","''"); //์ผ์ชฝ ํฐ ๋ฐ์ํ์์ ๋ฌธ์๋ฅผ ์ค๋ฅธ์ชฝ ํฐ ๋ฐ์ํ์์ ๋ฌธ์๋ก ์นํํ๋ค.
Str = str. Replace(";",""); // ์ฆ, ์์ค๋ค.
Str = str. Replace("--","");
Str = str. Replace("|","");
Str = str. Replace(":","");
Str = str. Replace("+","");
Str = str. Replace("\","");
Str = str. Replace("/","");
.....
return str;
}
๊ทธ๋ฌ๋, ๋ฌผ๋ก ํํฐ๋ง์ ํตํด์๋ SQL-injection์ ์๋ฐฉํ ์ ์์ง๋ง ๋ฐ์ธ๋ฉ์ด๋ผ๋ ๊ฒ๋ง ํด์ฃผ๋ฉด ํํฐ๋ง์ ํ์์๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฐฉ๋ฒ2. ๋ฐ์ธ๋ฉ
Dynamic SQL
----------
Private void cmdLogin_Click(object sender, System.EventArgs e) {
string strCnx = ConfigurationSettings.AppSettings[“cnxNWindBad”];
Using (SqlConnection cnx = new SqlConnection(strCnx))
{
SqlParameter prm;
Cnx.Open();
string strQry =
“SELECT Count(*) FROM Users WHERE UserName = @username “ + --์ฌ๊ธฐ์ 3์ค๋ณด๋ค, ์๋์ ๋ฐ์ธ๋ฉ์ด ์ค์ํ๋ค.
“AND Password = @password”;
Int intRecs;
SqlCommand cmd = new SqlCommand(strQry, cnx);
cmd.CommandType = CommandType.Text;
prm = new SqlParameter(“@username”,SqlDbType.VarChar,50); --๋ฌธ์์ด๋ก username์ ๋ฐ๊ณ ์์. -> ๋ฐ์ธ๋ฉ
prm.Direction = ParameterDirection.Input;
prm.Value = txtUser.Text;
cmd.Parameters.Add(prm);
prm = new SqlParameter(“@password”,SqlDbType.VarChar,50); --๋ฌธ์์ด๋ก password์ ๋ฐ๊ณ ์์. -> ๋ฐ์ธ๋ฉ
prm.Direction = ParameterDirection.Input;
prm.Value = txtPassword.Text;
cmd.Parameters.Add(prm);
intRecs = (int) cmd.ExecuteScalar();
if(intRecs > 0) {
FormsAuthentication.RedirectFromLoginPage(txtUser.Text, false);
}
else {
lblMsg.Text = “Login attempt failed.”;
}
}
}
----------
JSP.net
๋ฐฉ๋ฒ1. ํํฐ๋ง
ํํฐ๋ง๋ ์ญ์ ํํฐ๋ง๊ณผ ์นํ ํํฐ๋ง์ด ์๋ค.
public static String makeQuery(String str) {
String result = "";
if(str != null) {
result = chkNull(replace(str, "'", "")); // ์ผ์ชฝ ํฐ ๋ฐ์ํ์์ ๋ฌธ์๋ฅผ ์ค๋ฅธ์ชฝ ํฐ ๋ฐ์ํ์์ ๋ฌธ์๋ก ์นํํ๋ค.
result = chkNull(replace(str, ";", "")); // ์ฌ๊ธฐ์๋ ๋ชจ๋ ์ญ์ ํํฐ๋ง์ ์ฌ์ฉํจ์ ์ ์ ์๋ค.
result = chkNull(replace(str, "--", ""));
result = chkNull(replace(str, "|", ""));
result = chkNull(replace(str, ":", ""));
result = chkNull(replace(str, "+", ""));
result = chkNull(replace(str, "\", ""));
result = chkNull(replace(str, "/", ""));
result = chkNull(replace(str.toLowerCase(), "select", ""));
result = chkNull(replace(str.toLowerCase(), "update", ""));
result = chkNull(replace(str.toLowerCase(), "delete", ""));
result = chkNull(replace(str.toLowerCase(), "insert", ""));
result = chkNull(replace(str.toLowerCase(), "where", ""));
result = chkNull(replace(str.toLowerCase(), "from", ""));
result = "'"+result+"'";
}
return result;
}
public static String chkNull(String str) {
if (str == null)
return "";
else
return str;
}
**์ญ์ ํํฐ๋ง ์ฃผ์์ **
--> ์ด๋ ํ ํน์๋ฌธ์๊ฐ ์ ๋ ฅ๋๋ฉด ์ญ์ ๋๋๋ฐ, ์ด๋ ์๋ค์ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ถ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐฉ๋ฒ2. PreparedStatement ๊ฐ์ฒด ์ฌ์ฉ (PreparedStatement : jsp์์ injection์ ๋ง๊ธฐ์ํด ์ธ ์ ์์.)
----------
try{
String tableName = props.getProperty("jdbc.tableName");
String name = props.getProperty("jdbc.name")
String qury = "SELECT * FROM ? WHERE Name = ?";
stmt = con.perpareStatement(query); --์ ๋ฌธ์ฅ ์คํ ๋ช
๋ น.
stmt.setString(1, tableName); -- injection ์ ๋ง๊ธฐ ์ํ ์ค์ํ ๋ถ๋ถ! --> ๋ฐ์ธ๋ฉ
stmt.setString(2, name); -- injection ์ ๋ง๊ธฐ ์ํ ์ค์ํ ๋ถ๋ถ! --> ๋ฐ์ธ๋ฉ
rs = stmt.executeQuery();
.....
}
catch (SQLException sqle){ }
finally { }
----------
์์ ๊ฐ์ ๊ฒฝ์ฐ, ์ฌ์ค ๋จผ์ setstring์ผ๋ก ๋ฐ์ธ๋ฉ์ ํด์ค ํ, preparedstatement๊ฐ ์๋๋ผ ๊ทธ๋ฅ statement๋ฅผ ์ฌ์ฉํด๋ injection์ ๋ง์ ์ ์๋ค.
* Dynamic SQL ๊ตฌ๋ฌธ ์ฌ์ฉ ๊ธ์ง --> ์ฌ์ค ํํฐ๋ง์ด๋ ๋ฐ์ธ๋ฉ๋ง ์ํ๋ฉด ์ฌ์ฉํด๋ ๋จ.
* XML๋ฌธ์์์ ์ฃผ๋ก ๋์ ๋ฌธ์๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
** PC์์ ๊ฐ์ ์ ๋ ฅํ๋ฉด ๋จผ์ html, jsp์ ๋จผ์ ์ง๋๊ฐ๊ณ XML๋ฌธ์๋ก ๊ฐ๋๋ฐ,
html ํน์ jsp์์ ํํฐ๋ง์ด๋ ๋ฐ์ธ๋ฉ์ ์๋ง ํด์ค๋ค๋ฉด XML๋ฌธ์์์๋ $(๋์ ), #(์ ์ ) ์ค ์ด๋๊ฒ์ด๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋๊ธ