AppSec .NETでの非常に単純なタスク

週末の後、頭を伸ばして、一見してC#での簡単なプログラミングタスクで週を始めてください。 これらのタスクはすべて、アプリケーションセキュリティ、アプリケーションセキュリティの分野である暗い領域に関連しているため、新しい観点からプロジェクトのコードを見るように強制するでしょう。 AppSecと.NETプラットフォームについてはあまり書かれておらず、さらに少ないと言われ、マネージド言語を使用すると魔法のようにアプリケーションが安全になると考える人もいます。 私は、会議で.NETプラットフォームのセキュリティのさまざまな側面について話すことにより、この状況を修正しようとします。 そこで今週、木曜日に、私たちのコミュニティSPB .NET Communityは、 安全なASP .NETアプリケーションの開発に専念する会議をサンクトペテルブルクで開催します 。 この会議の詳細に関心がある人、サンクトペテルブルクの開発者の.NETコミュニティについてもっと知りたい、AppSec .NETで問題を解決することに挑戦したい人、ぜひcatに招待してください!



HabréはSPB .NETコミュニティについてまだ書いていないのでおそらくそれから始めます。 6月、.NETプログラマーのコミュニティがサンクトペテルブルクに集まりました。 私たちの目標は、作業中に遭遇した問題を解決する経験を共有し、オフラインで集まって現在の問題や.NETの世界からのニュースについて話し合うことです。 現在、プラットフォームは開発ブームを迎えています。ここでは、膨大な量のコードがオープンソースで公開され、新しいWebプラットフォームが登場し、2つの新しいC#言語標準についての議論が行われています。 ルイスが言ったように、我慢するには、走らなければなりません。 そして、全員が一緒に走ると、追いつく可能性が高まります(ランナーは比metaを理解します)。 それで、すでに行われたこと。 最初の会議を開催し、 IT Global Meetupで島を組織し、4つのプレゼンテーションを行い、お互いを知り合い、将来の計画について話し合うことができました。 レビューから判断すると、私はレポートが好きで、.NETパーティーの定例会議を復活させるというアイデアはすでに頭にありました。



現在、2回目の会議を準備しています。 DataArtのサンクトペテルブルクオフィスで6月25日、19時30分に開催されます 。会議の主なトピックは、 安全なアプリケーションの開発でした 。 今週の木曜日、情報セキュリティ全般、特に.NETプラットフォームの有名な専門家であるVladimir Kochetkov VladimirKochetkovがサンクトペテルブルクにやって来ます。 彼は私たちの会議に参加することに同意したので、ブログ、ウェビナー、またはRSDNチームでの彼の仕事でVolodyaに精通している人は、彼と個人的にチャットする機会があります。 会議プログラムには2つのレポートと多くのコミュニケーションがあります。これらは「アプリケーションセキュリティ.NET理論」ウラジミールコチェトコフと「アプリケーションセキュリティ.NETプラクティス」ミハイルシェバコフです(私のレポート)。 最近の会議でこのトピックに関する資料、この.NEXTdotnetconf.ruSECONと話しました 。 しかし、mitapのために、彼は会議で分析する新しい例とタスクを準備しました。 ああ、はい、タスク... mitapについてはもう説明しません。spbdotnet.orgコミュニティグループの発表を読んで、 ここに登録してください 。 参加はもちろん無料です。登録のみが必要です(残念ながら座席数は制限されていますが、無料の座席があります)。



そして今、タスクの注意。



  1. セキュリティの問題には、次のaspxページのコードが含まれていますか? 含まれている場合、どのコードのどの行にありますか? アスタリスクの付いた質問:攻撃を実証するためにサーバーに送信する必要があるデータは何ですか? コードを実行するための条件は標準です。デフォルト設定のIIS 8.5サーバーでは、aspxページはデフォルト設定のWebプロジェクトの一部であり、Framework 4.5.1で構築されます。



    <%@ Page Language="C#" AutoEventWireup="true"%> <script language="C#" runat="server"> protected void Page_Load(object sender, EventArgs e) { var text = TextBox1.Text + TextBox2.Text; if (text != String.Empty) { Label1.Text = "Input: " + text; } else { TextBox1.Text = Request["first"] + Request["second"]; } int count; if (Int32.TryParse(Request["count"], out count)) { for (int i = 0; i < count; i++) { var name = String.Format("base64_item{0}", i); var value = Request[name]; if (value != null) { RadioButtonList1.Items.Add(new ListItem(Encoding.UTF8.GetString(Convert.FromBase64String(value)), value)); } } } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> </head> <body> <!-- <asp:Label runat="server"> <%= Request["first"] + Request["second"] %> </asp:Label> --> Preview: <img src="<%= ResolveUrl("~/Content/Images/" + Request["page"] + ".png")%>"/> <form id="form1" runat="server"> <asp:Label ID="Label1" runat="server"></asp:Label><br/> <asp:RadioButtonList ID="RadioButtonList1" runat="server"/><br/> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br/> <asp:Button ID="Button1" runat="server" Text="Save"/> </form> </body> </html>
          
          





  2. 次のC#コードにはセキュリティの問題が含まれていますか? 攻撃者はどのようにして脆弱性を利用できますか? このコードをどのように修正しますか? データベースへのアクセスはEntity Frameworkのクラスを介して行われ、CoinsDBはデータベースのコンテキストクラスであり、DbContextの後継です。 CustomerLoginは、データベースのエンティティのクラスです。そのコードは次のとおりです。 上記の例のように、コード実行条件は標準です。データベースはMS SQLです。



     protected void Page_Load(object sender, EventArgs e) { using (var db = new CoinsDB()) { var where = String.Empty; var parameters = new List<object>(); var email = Request["email"]; if (email != null) { where += String.Format(" email LIKE '{0}%'", email); } var field = Request["field"]; var min = Request["min"]; var max = Request["max"]; if (field != null && min != null && max != null) { if (!String.IsNullOrEmpty(where)) { where += " AND"; } where += String.Format(" {0} >= @min AND {0} <= @max", EncodeSqlField(field)); parameters.Add(new SqlParameter("@min", min)); parameters.Add(new SqlParameter("@max", max)); } var query = "SELECT * FROM CustomerLogin"; if (!String.IsNullOrEmpty(where)) { query += " WHERE"; query += where; } var output = db.Database.SqlQuery<CustomerLogin>(query, parameters.ToArray()).ToArray(); lblOutput.Text = output.Length == 0 ? "Not found" : String.Join("<br/>", output.Select(customer => customer.login + " - " + customer.rating)); } } private string EncodeSqlField(string field) { return field.Replace("'", String.Empty) .Replace(" ", String.Empty) .Replace("\\", String.Empty) .Replace(",", String.Empty) .Replace("(", String.Empty) .Replace(")", String.Empty); } [Table("CustomerLogin")] public partial class CustomerLogin { [Key] [StringLength(100)] public string login { get; set; } [StringLength(100)] public string email { get; set; } public long raiting { get; set; } public long customerNumber { get; set; } [Required] [StringLength(40)] public string password { get; set; } public short? question_id { get; set; } [StringLength(50)] public string answer { get; set; } }
          
          







回答、ネタバレの下にコメントを書いてください。 6月25日に会議で興味深い事例をすべて分析します。



All Articles